redis是一个高性能的key-value数据库,其支持丰富数据类型,支持string,hash,list,set,sorted set等。
一、五种数据类型的使用
1、string 的使用
在实际项目中,最简单的是 SET key value ,其中 value 设为 json 序列化的字符串,但这样在取数据时,会导致只需要 value 中的一部分数据时,需要将整个 json 字符串全部取出来,然后再解析查找,会显得比较麻烦。我们可以使用 MSET 和 MGET 进行批量操作,例如 MSET user:1:name zhangsan user:1:age 18。
此外,文章的浏览次数也可以使用。INCR article:readcount:{文章id} 和 GET article:readcount:{文章id}
2、hash 的使用
上面用户的存储也可使用hash ,HMSET user 1:name zhangsan 1:age 18 和 HMGET user 1:name 1:age 。
商品购物车 ,以用户id为key,商品id为field,数量为value。
HSET cart:{用户id} {商品id} 初始数量。增加商品数量 HINCRBY cart:{用户id} {商品id} 1。购物车商品总数量可用 HLEN cart:{用户id}。
3、list 的使用
微博微信信息流。当一个大V发送完消息后,后台逐渐给每个关注人的列表都添加新的信息。LPUSH msg:{你自己的用户id} 消息id。当你关注的另一个大V发送消息时,也重复LPUSH msg:{你自己的用户id} 新消息id。查询消息使用 LRANGE msg:{你自己的用户id} 0 10。
4、set 的使用
- 抽奖
- 参与抽奖 SADD key {userId},
- 查看参与抽奖的所有用户 SMEMBER key。
- 抽取 count 名中奖者 SRANDMEMBER key [count] / SPOP key [count]【注:SPOP 会将元素从 set 中删除】。
- 点赞、收藏、标签等
- 点赞 SADD like:{消息ID} {用户ID}。
- 取消点赞 SREM like:{消息ID} {用户ID}。
- 检查用户是否点赞 SISMEMBER like:{消息ID} {用户ID}。
- 获取点赞的用户列表 SMEMBERS like:{消息ID}。
- 获取点赞用户数 SCARD like:{消息ID}。
- 微信微博的关注
- 共同关注:SINTER user1set user2set。
- 我关注的人也关注他:SISMEMBER userset1 {他}。
- 我可能认识的人:SDIFF 我关注的人的集合 我关注人中某个人的关注人的集合。
5、zset 的使用
排行榜。
- 点击新闻
ZINCRBY hotNews:20190722 1 双宋离婚 - 展示当日排行前十
ZREVRANGE hotNews:20190722 0 10 WITHSCORES - 七日搜索榜单计算
ZUNIONSTORE hotNews:20190716-hotNews:20190722 7 hotNews:20190716 hotNews:20190717 ... hotNews:20190722 - 展示当日排行前十
ZREVERANGE hotNews:20190716-hotNews:20190722 0 10 WITHSCORES
二、分布式锁
1、使用 Redis 的 setnx 命令
简单实现的话,使用 setnx 设置个变量(锁)并且有超时时间,任务完成时删掉这个变量释放掉锁。
2、使用redisson
- 引入pom文件
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.4</version>
</dependency>
- 代码配置
@Bean
public Redisson redisson(){
//此为单机模式
Config config = new Config();
config.userSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
return (Redisson)Redisson.create(config);
}
- 实际使用
RLock redisLock = redisson.getLock(lockKey);
//注意下方上锁代码会开启一个新线程,来保证锁不会因为超时时间而过期。也可不设置时间,使用默认的30秒。
redisLock.lock(30, TimeUnit.SECONDS);
//...
redisLock.unlock();
扩展:分布式锁可使用zookeeper
扩展链接:
Redis 命令参考
面试题Redis最常被问到知识点总结
网友评论