Redis如何在项目中合理使用经验分享
概述
Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,本文将介绍Redis如何在项目中合理使用。
背景
- Redis是一个开源的内存数据结构存储系统。
- 可以作为数据库、缓存和消息中间件使用。
- 支持多种类型的数据结构。
- Redis内置了复制(replication),LUA脚本(Luascripting),LRU驱动事件(LRUeviction),事务(transactions)和不同级别的磁盘持久化(persistence)。
- 通过Redis哨兵(Sentinel)和Redis集群(Cluster)的自动分区,提供高可用性(highavailability)。
基本数据类型
字符串(strings)
1、string的过期时间在重新设置值之后会被清除
127.0.0.1:6379>sethello3 OK 127.0.0.1:6379>gethello "3" 127.0.0.1:6379>ttlhello (integer)-1 127.0.0.1:6379>expirehello3000 (integer)1 127.0.0.1:6379>sethello4 OK 127.0.0.1:6379>ttlhello (integer)-1
2、设置string类型的值可以覆盖任何其他类型
127.0.0.1:6379>saddsettest1,2 (integer)1 127.0.0.1:6379>typesettest set 127.0.0.1:6379>setsettesthello OK 127.0.0.1:6379>typesettest string 127.0.0.1:6379>saddsettesta,b (error)WRONGTYPEOperationagainstakeyholdingthewrongkindofvalue
- 散列(hashes)
- 列表(lists)
Redislists基于LinkedLists实现。头尾操作极速,检索较慢
- 集合(sets)
- 支持范围查找的有序集合(sortedsets)
有序集合的排序默认按照字典序排列
- bitmaps
- hyperloglogs
- 支持按半径索引查询的地理空间(geospatial)
应用场景
string
- 缓存数据
不管是简单和复杂的数据都可以直接转为string存储。
key:active:spring2019:titlevalue:"2019春节活动"操作:set
商品信息,省市区信息,活动配置等一系列不常变化的冷数据缓存
非常热门数据的缓存,游戏排行,后台每秒更新一次数据
- 简单计数
2019春节活动参加人数
key:active:spring2019:totalvalue:3045操作:incr
- 定时过期
一个人一天只能进行一次签到
key:active:checkin:userId:10000:day:20190101value:签到时间戳操作:expire
- 分布式锁
下面的代码不严谨,nx可以放并发
127.0.0.1:6379>setlockkey1nx OK 127.0.0.1:6379>setlockkey1nx (nil)
list
- 用户排队
push,pop
- 有序消息
push,pop
- 实现生产者和消费者模型
阻塞式访问BRPOP和BLPOP命令
set
- 去重列表
2019春节活动参加人数
key:active:spring2019:usersvalue:100010,10020操作:很多
- 标签
用户标签
商家标签
春节活动一共有abcde5个任务,用户A已经完成a,b,用户B已经完成c,d
- 交集
用户A,用户B都完成的任务
- 并集
用户A,用户B任一完成的任务
- 差集
用户A还没有完成的任务
- 获取随机元素
从礼品库set中随机获得一个礼品
hash
- 同一资源的不同属性
用户在活动期间一共获得了不同种类奖品数量
key:active:spring:g'ifts:user:10010value:{"giftA":2,"giftB":5}操作:很多
可以直接对giftA执行incr操作
zset
- 排行榜
用户消费排行,点赞排行等
key:active:spring:star:rankvalue:用户ID,score:点赞数量操作:很多
根据分数获取top10
查询某个用户的分数
查询得分在90-100之间的用户
有时候我们的得分并不是由某一项业务值决定的,可能是由两项业务值来排序的,比如先看用户的实际得分,在看用户等级,那么我们在设计score的时候可以用小数点之前的值表示得分,小数点之后的值表示等级,如果有其他特殊要求,还可以考虑得分加上某个极大值来处理。
注意事项
- 每个key都应该有合理的失效时间
- string的过期时间在重新设值后会被覆盖
- string类型的set操作可以覆盖类型
- 合理使用相应的数据结构
不要用list存大量数据并检索
- 合理规划key的数量
判断用户有没有参加应该用set,不应该每个用户一个key
- 环境数据隔离
- 业务数据隔离用户redis业务redis活动redis应该做区分,活动的redis在活动结束后可以自由清理
- 合理使用管道,lua脚本和redis事务,提高性能,尤其是在脚本中使用redis的时候
- 在有大量key的Reids线上系统,要在主库禁用keys*操作,防止卡死
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。