Featured image of post Redis学习笔记(一)--基础命令

Redis学习笔记(一)--基础命令

【Redis学习笔记】基础命令

Redis 基础

基本命令

通用命令

  • select

    示例:

    1
    2
    
    select 0
    # 选择0号数据库
    
  • keys

    示例:

    1
    2
    3
    4
    5
    
    keys he*
    keys he[h-l]*
    keys ph?
    # 根据Pattern表达式查询符合条件的Key
    # 注意:不要在生产环境中使用,会阻塞线程
    
  • dbsize

    示例:

    1
    2
    
    dbsize
    # 返回key的总数
    
  • exists

    示例:

    1
    2
    
    exists a
    # 查询key=a是否存在
    
  • del

    示例:

    1
    2
    
    del a
    # 删除key=a的数据
    
  • expire

    示例:

    1
    2
    
    expire hello 20
    # 设置key=hello 在20s后过期
    
  • ttl

    示例:

    1
    2
    
    ttl hello
    # 查看key=a的过期剩余时间
    
  • flashdb

    示例:

    1
    2
    
    flashdb
    # 清空当前数据库中的所有数据
    
  • flashall

    示例:

    1
    2
    
    flashall
    # 删除所有数据库中的所有数据
    

Redis 常用的五种数据结构

Redis 数据类型 - 字符串

value可以是字符串,可以是数字,可以是位数字

String最大512MB,建议单个KV不超过100KB

字符串结构应用类型

  1. 缓存
  2. 秒杀
  3. 分布式锁
  4. 配置中心
  5. 对象序列化
  6. 计数器

Redis 字符串指令

  • get

    示例:

    1
    2
    
    get hello
    # 获得key=hello的结果
    
  • set

    示例:

    1
    2
    
    set hello world
    # 设置key=hello , value=world
    
  • mset /  mget

    示例:

    1
    2
    3
    
    mset hello world java best
    mget hello java
    # 一次性 设置 或者 获取 多个kv
    
  • getset

    示例:

    1
    2
    
    setget db mongodb
    # 设置新值返回旧值,若没有旧值则返回null并赋予新值
    
  • setnx

    1
    2
    3
    
    setnx job programmer
    setnx job farmer # 执行失败
    # 指定key不存在时设置,若存在则不设置
    
  • del

    示例:

    1
    2
    
    del hello
    # 删除key=hello的数据
    
  • incr / decr

    示例:

    1
    2
    3
    
    incr count
    decr count
    # key值 自增 / 自减 1
    
  • incrby / decrby

    示例:

    1
    2
    3
    
    incrby count 99
    decrby count 99
    # key值 自增 / 自减 指定步长
    

Redis 数据类型 - hash

Redis hash 是一个 string 类型的 field (字段) 和 value (值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2^32^ -1 个键值对(40多亿)。可以理解为每个key存储了一个HashMap对象,通过一个Key可以保存一个数据结构。

hash应用场景

Hash用于存储结构化数据,比如员工i谢谢你,用户信息等等

Redis Hash 命令

  • hset

    示例:

    1
    2
    
    hset myhash field "foo"
    # 设置单个hash字值段
    
  • hmset

    1
    2
    
    hmset myhash field1 "hello" field2 "world"
    # 设置多个hash字值段
    
  • hget

    1
    2
    
    hget myhash field1
    # 提取一个redis的key的某个哈希值
    
  • hgetall

    1
    2
    
    hgetall myhash
    # 提取一个redis的key的所有哈希值,以键/n值/n的形式返回
    
  • hexists

    1
    
    hexists myhash field
    
  • hdel

    1
    2
    
    hdel myhash field1 filed2
    # 删除n条记录
    
  • hval

    1
    2
    
    hval myhash
    # 返回hash的value的列表,key不存在返回空表
    

Redis 数据类型 - List

List列表是简单的字符串列表,按照插入顺序排序。可以添加元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 2^32^-1个元素

List 应用场景

保存有需数据队列,例如:排行榜ID队列 / XX购物车商品ID队列 / XX班级ID队列

获取到ID队列后,再根据每一个ID获取对应的HASH对象

Redis List 命令

  • rpush

    1
    2
    
    rpush listkey c b a
    # 在队尾插入新数据
    
  • lpush

    1
    2
    
    lpush listkey f e d
    # 在队首插入新数据
    
  • lrange

    1
    2
    3
    4
    5
    6
    
    lrange listkey 0 -1
    # d e f c b a
    # 获取所有
    lrange listkey 0 2
    # d e f
    # 获取队列数据
    
  • rpop

    1
    2
    3
    
    rpop listkey
    # a
    # 从右侧弹出数据
    
  • lpop

    1
    2
    3
    
    lpop listkey
    # d
    # 从左侧弹出数据
    

Redis 数据类型 - Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,即不会存在重复的数据

Redis 中 Set 集合是通过 哈希表 实现的,故添加、删除。查找的复杂度都是O(1),对Set操作的执行效率极高

集合中的最大成员数为 2^32^-1 个元素

Redis Set 应用场景

Set数据类型常用于交际 / 并集 / 差集 运算

典型场景为:

  • 我与XX位好友共同关注了XXX
  • 将两个数据源的数据清单进行合并
  • 找出X与Y集合的差异
  • 抽奖活动

Redis Set 命令

  • sadd

    1
    2
    3
    
    sadd user:1:follow fay
    sadd user:1:follow kirov faye harry
    # 新增set数据
    
  • smembers

    1
    2
    3
    
    smembers user:1:follow 
    # fay harry faye kirov (不保证顺序)
    # 查看set数据
    
  • srandmember

    1
    2
    
    srandmember user:1:follow 2
    # fay kirov (不保证顺序,不改变原集合中的顺序)
    
  • spop

    1
    2
    3
    
    spop user:1:follow
    # fay (随机且改变原集合)
    # 随机弹出一个元素
    
  • sdiff

    1
    2
    3
    
    sdiff user:2:follow user:1:follow
    # sports ent news
    # sdiff计算的是以左侧Set为基准,查找在右侧Set不存在的条目
    
  • sinter

    1
    2
    
    sinter user:1:follow user:2:follow
    # 计算交集
    
  • sunion

    1
    2
    
    sunion user:1:follow user:2:follow
    # 计算并集
    

Redis 数据类型 - ZSet

Redis 的 ZSet 是 String 类型的有序Set集合。集合成员是唯一的,即不会存在重复的数据

ZSet 和 List 的区别

List 强调数据是按存储顺序有序排列,存储顺序与迭代顺序是一致的

ZSet 则是给出分数进行排序,存储顺序与迭代顺序是不一致的

Redis ZSet 应用场景

各种多维度排行榜

Redis ZSet 命令

  • zadd

    1
    2
    
    zadd player:ranke 1000 fay 900 kirov 800 pinkman 600 grovy
    # 新增数据
    
  • zrange

    1
    2
    3
    4
    5
    
    zrange player:rank 0 -1
    # grovy pinkman kirov fay
    zrange player:rank 0 -1 with scores
    # grovy 600 pinkman 800 kirov 900 fay 1000 (将分值一并写出)
    # 根据分值从小到大进行排列
    
  • zscore

    1
    2
    
    zscore play:rank fay
    # 获取分数
    
  • zrank

    1
    2
    
    zrank play:rank fay
    # 获取排名
    
  • zrevrank

    1
    2
    
    zrank play:rank fay
    # 反向排名
    
  • zrevrange

    1
    2
    3
    
    zrevrange player:rank 0 -1
    zrevrange player:rank 0 -1 with scores
    # 反向排序
    
  • zrem

    1
    2
    
    zrem play:rank grovy
    # 移除指定元素
    
  • zcount

    1
    2
    3
    
    zcount player:rank 700 1000
    # 3
    # 获取符合分数要求数据量
    
  • zrangebyscore

    1
    2
    
    zrangebyscore player:rank 700 1000 wiht scores
    # pinkman 800 kirov 900 fay 1000
    

Redis 开发规约

Key 的设计

image-20220413002604596

不同类型的应用场景

image-20220413002627850

Redis 的安全建议

  • Redis 不要在外网被访问,禁止:bind 0.0.0.0
    • - bind 192.168.132.128
  • 更改 Redis 端口,不要6379
    • port : 8838
  • Redis 使用非 root 启动
  • Redis 没有设置密码或者弱密码,不要与登陆密码相同
    • requirepass 与 masterauth
  • 定期备份,save 命令
  • 配置号 Linux 防火墙规则
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计