数据类型
String
- 单值缓存 set user:1 json数据
- 多值缓存 mset user:1:name zhangsan user:1:age 18
- 分布式锁 setnx key value 返回0或1 防止其他人修改
- 删除数据 del key value
- 计数器 incr article:readCount 999 增长 获取阅读数get article:readCount
- web集群 session共享 spring session +redis实现session共享
- 分布式系统全局序列号生成 incrby orderId 100 用于数据库产生主键
Hash Map<Map<String,String>>
- 对象缓存 hmset user 1:name zhangsan 1:age 18
- 优点
- 同类数据归类存储方便数据管理
- 相比String更小的内存操作
- 相比String更小的存储空间
- 缺点
- 过期功能不能在field上使用 只能在key上
- redis集群下不适合大规模使用
- 应用场景
- 购物车功能 用户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 数组
- 插入到最左侧 Lpush key value
- 插入到右侧 rpush key value
- 移除并返回列表最左侧的元素 lpop key
- 移除并返回列表最右侧的元素 rpop key
- 返回列表指定区间的元素 lrange key start stop
- 从key表头返回一个元素若列表没有阻塞等待timeout秒 若timeout=0一直阻塞 blpop key timeout
- 从key表尾返回一个元素若列表没有阻塞等待timeout秒 若timeout=0一直阻塞 brpop key timeout
- 应用场景 微博关注人
- 关注人发微博 lpush msg:{我的id} 文章id
- 取出 lrange msg:{我的id} 0 5
set 集合 无序集合
- 存入元素,若存在则忽略 sadd key member
- 删除元素 srem key member
- 获取key所有元素 smembers key
- 判断元素是否在集合内 sismember key member
- 从集合中选出count个元素不删除 srandmember key count
- 从集合中选出count个元素并删除 spop key count
- 运算操作
- 交集 sinter key key
- 交集结果存入新的集合 sinterstore key2 key key
- 并集 sunion key
- 差集 sdiff key 以第一个元素为主减去后面集合并集的结果
- 应用场景
- 点赞收藏
- 点赞 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有序集合
- 往有序集合key添加带分值的元素 zadd key sore member
- 从key中删除元素 zrem key member
- 返回有序集合key中元素的分数 zscore key member
- 元素个数 zcard key
- 正序返回有序集合从start到stop的元素 zrange key start stop [withscores]
- 倒序返回有序集合从start 到是stop的元素 zrevrange key start stop [withscores]
- key中元素增长 zincrby key 数值 member
- 计算操作
- 并集 zunionstore 新的集合 key key key
- 交集 zinterstore 新的集合 个数 key key key
- 应用场景 排行榜
- 维护 zincrby hostNews:xxxx 1 热点加1
- 当日前十 zrevrange hostNews:xxxx 0 10
- 七日排行榜 zunion hostNews7:xxxx 7 hostNews1:xxxx …
- 七日前十 zrevrang hostNews7:xxxx 0 10 withscores
Redis 核心原理
- Redis单线程为什么运行还这么快
- 数据存储在内存中,运算快
- 单线程避免多线程切换损耗性能
- Redis单线程如何处理那么多的并发客户端
- Redis的IO多路复用 将连接信息和事件放到队列中,依次放到文件事件分发器 事件分发器分发给事件处理器
高级命令
- keys * 全量遍历键
- scan 渐进式遍历键 scan [cursor] [match pattern] [count]
scan 0 match c* 10
查找前10条以c开头的键
Redis持久化
RDB快照 将内存数据快照保存在dump.rdb 在n秒内数据集至少有n个改动条件被满足时自动保存
- 配置
- dbfilename:dump.rdb 文件名
- dir ./ 存储位置
- snapshoting 触发规则 默认配置 save 900 1 save 300 10 save 60 1000(60秒内有1000个set incr操作保存)
- 手动保存
- save 同步操作 阻塞其他命令 不消耗额外内存
- bgsave 异步操作 不阻塞其他命令(短暂 生成子命令) 需消耗额外内存
- 恢复 二进制文件
AOF 每执行一行命令或每秒写一次
- 配置
- appendonly yes 开启aof
- appendfsysnc always 每执行一条命令就保存一次
- appendfsync everysec 每秒钟保存一次
- appendfsync no 交由操作系统决定
- AOF文件解析
- 3 3个单词
- $ 3 下面这个单词由3个字符
- 恢复 按appendonly.aof 一个一个命令执行
- 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修改内存数据的命令保存在一起