Redis基本数据类型与持久化

数据类型

String
  1. 单值缓存 set user:1 json数据
  2. 多值缓存 mset user:1:name zhangsan user:1:age 18
  3. 分布式锁 setnx key value 返回0或1 防止其他人修改
  4. 删除数据 del key value
  5. 计数器 incr article:readCount 999 增长 获取阅读数get article:readCount
  6. web集群 session共享 spring session +redis实现session共享
  7. 分布式系统全局序列号生成 incrby orderId 100 用于数据库产生主键
Hash Map<Map<String,String>>
  1. 对象缓存 hmset user 1:name zhangsan 1:age 18
  2. 优点
    • 同类数据归类存储方便数据管理
    • 相比String更小的内存操作
    • 相比String更小的存储空间
  3. 缺点
    • 过期功能不能在field上使用 只能在key上
    • redis集群下不适合大规模使用
  4. 应用场景
    • 购物车功能 用户id为key 商品id为field 数量为value
    • 增加商品 set cart:10001 1099 1 为10001用户购物车增加一个id为1099的商品
    • 增长商品 hincrby cart:10001 1099 1 为用户10001用户购物车增长1099商品
    • 减少购物车数量hdecry cart:10001 1099 1 为用户10001购物车减少1099商品
    • 商品总数 hlen cart:10001
    • 获取所有商品hgetall cart:10001
list 数组
  1. 插入到最左侧 Lpush key value
  2. 插入到右侧 rpush key value
  3. 移除并返回列表最左侧的元素 lpop key
  4. 移除并返回列表最右侧的元素 rpop key
  5. 返回列表指定区间的元素 lrange key start stop
  6. 从key表头返回一个元素若列表没有阻塞等待timeout秒 若timeout=0一直阻塞 blpop key timeout
  7. 从key表尾返回一个元素若列表没有阻塞等待timeout秒 若timeout=0一直阻塞 brpop key timeout
  8. 应用场景 微博关注人
    • 关注人发微博 lpush msg:{我的id} 文章id
    • 取出 lrange msg:{我的id} 0 5
set 集合 无序集合
  1. 存入元素,若存在则忽略 sadd key member
  2. 删除元素 srem key member
  3. 获取key所有元素 smembers key
  4. 判断元素是否在集合内 sismember key member
  5. 从集合中选出count个元素不删除 srandmember key count
  6. 从集合中选出count个元素并删除 spop key count
  7. 运算操作
    • 交集 sinter key key
    • 交集结果存入新的集合 sinterstore key2 key key
    • 并集 sunion key
    • 差集 sdiff key 以第一个元素为主减去后面集合并集的结果
  8. 应用场景
    • 点赞收藏
      • 点赞 sadd like:{消息id} 用户id
      • 取消点赞 srem like:{消息id} 用户id
      • 检查用户是否点赞 sismember like:{消息id} 用户id
      • 获取点赞列表 smembers like:{消息id}
      • 获取点赞用户数 scard like:{消息id}
    • 用户关系模型
      • 共同关注 求交集
      • 我关注的人也关注了他 将我的关注的人分别执行sismember 其他人
      • 我可能认识的人 sdiff 他的集合 我的集合
    • 电商商品筛选
      • sadd brand:huawei 华为p40
      • sadd brand:xiaoxi 小米10
      • sadd cpu:brand:gaotong 华为p40 小米10
      • sadd ram:8g 小米10
      • sinter brand:huawei cpu:brand:gaotong ram:8g ===> 小米10
zset有序集合
  1. 往有序集合key添加带分值的元素 zadd key sore member
  2. 从key中删除元素 zrem key member
  3. 返回有序集合key中元素的分数 zscore key member
  4. 元素个数 zcard key
  5. 正序返回有序集合从start到stop的元素 zrange key start stop [withscores]
  6. 倒序返回有序集合从start 到是stop的元素 zrevrange key start stop [withscores]
  7. key中元素增长 zincrby key 数值 member
  8. 计算操作
    • 并集 zunionstore 新的集合 key key key
    • 交集 zinterstore 新的集合 个数 key key key
  9. 应用场景 排行榜
    • 维护 zincrby hostNews:xxxx 1 热点加1
    • 当日前十 zrevrange hostNews:xxxx 0 10
    • 七日排行榜 zunion hostNews7:xxxx 7 hostNews1:xxxx .......
    • 七日前十 zrevrang hostNews7:xxxx 0 10 withscores

Redis 核心原理

  1. Redis单线程为什么运行还这么快
    • 数据存储在内存中,运算快
    • 单线程避免多线程切换损耗性能
  2. Redis单线程如何处理那么多的并发客户端
    • Redis的IO多路复用 将连接信息和事件放到队列中,依次放到文件事件分发器 事件分发器分发给事件处理器

高级命令

  • keys * 全量遍历键
  • scan 渐进式遍历键 scan [cursor] [match pattern] [count]scan 0 match c* 10 查找前10条以c开头的键

Redis持久化

RDB快照 将内存数据快照保存在dump.rdb 在n秒内数据集至少有n个改动条件被满足时自动保存
  1. 配置
    • dbfilename:dump.rdb 文件名
    • dir ./ 存储位置
    • snapshoting 触发规则 默认配置 save 900 1 save 300 10 save 60 1000(60秒内有1000个set incr操作保存)
  2. 手动保存
    • save 同步操作 阻塞其他命令 不消耗额外内存
    • bgsave 异步操作 不阻塞其他命令(短暂 生成子命令) 需消耗额外内存
  3. 恢复 二进制文件
AOF 每执行一行命令或每秒写一次
  1. 配置
    • appendonly yes 开启aof
    • appendfsysnc always 每执行一条命令就保存一次
    • appendfsync everysec 每秒钟保存一次
    • appendfsync no 交由操作系统决定
  2. AOF文件解析
      • 3 3个单词
    • $ 3 下面这个单词由3个字符
  3. 恢复 按appendonly.aof 一个一个命令执行
  4. AOF重写 aof文件中有太多没用的命令
    • 举例: incr count 1, incr count 1, incr count 1, ==> incr count 3
    • 配置
      • auto-aof-rewrite-min-size-64mb aof至少达到64m自动重写
      • auto-aof-rewrite-perentage 100 aof文件自上次重写增长100%再次触发
混合持久化 在aof重写时将重写这一刻之前的内存做rdb快照,并且rdb快照内存和增量aof修改内存数据的命令保存在一起

猜你喜欢

转载自www.cnblogs.com/JaminYe/p/13388300.html