Redis 简单知识点

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 的使用

  1. 抽奖
  • 参与抽奖 SADD key {userId},
  • 查看参与抽奖的所有用户 SMEMBER key。
  • 抽取 count 名中奖者 SRANDMEMBER key [count] / SPOP key [count]【注:SPOP 会将元素从 set 中删除】。
  1. 点赞、收藏、标签等
  • 点赞 SADD like:{消息ID} {用户ID}。
  • 取消点赞 SREM like:{消息ID} {用户ID}。
  • 检查用户是否点赞 SISMEMBER like:{消息ID} {用户ID}。
  • 获取点赞的用户列表 SMEMBERS like:{消息ID}。
  • 获取点赞用户数 SCARD like:{消息ID}。
  1. 微信微博的关注
  • 共同关注: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

  1. 引入pom文件

    org.redisson
    redisson
    3.11.4

  1. 代码配置
@Bean
public Redisson redisson(){
  //此为单机模式
  Config config = new Config();
  config.userSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
  return (Redisson)Redisson.create(config);
}
  1. 实际使用
RLock redisLock = redisson.getLock(lockKey);
//注意下方上锁代码会开启一个新线程,来保证锁不会因为超时时间而过期。也可不设置时间,使用默认的30秒。
redisLock.lock(30, TimeUnit.SECONDS);
//...
redisLock.unlock();

扩展:分布式锁可使用zookeeper

扩展链接:
Redis 命令参考
面试题Redis最常被问到知识点总结

你可能感兴趣的:(Redis 简单知识点)