Redis常用场景:

缓存

常用String类型
例如:对热点数据进行缓存,全页查询缓存,可以提升热点数据的访问稳定性和访问速度

数据共享分布式

常用String类型
redis是分布式的独立服务,可以在多个应用之间共享数据
例如:分布式session

分布式锁

常用setnx方法进行设置,只有在不存在时才会添加成功

  1. public static boolean getLock(String key) {
  2. Long flag = jedis.setnx(key, "1");
  3. if (flag == 1) {
  4. jedis.expire(key, 10);
  5. }
  6. return flag == 1;
  7. }
  8. public static void releaseLock(String key) {
  9. jedis.del(key);
  10. }

全局 ID

常用int类型,使用incrby,利用原子性
例如:分库分表的场景,一次取出一段

  1. incrby userid 1000

计数器

常用int类型,使用incr方法
例如:文章的访问量,微博点赞量,允许一定时间的延迟,先写入redis,再延时同步到数据库

限流

常用int类型,incr方法
以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

位统计

常用String类型,bitcount
字符是以8位二进制的形式进行存储

  1. set k1 a
  2. setbit k1 6 1
  3. setbit k1 7 0
  4. get k1
  5. /* 6 7 代表的a的二进制位的修改
  6. a 对应的ASCII码是97,转换为二进制数据是01100001
  7. b 对应的ASCII码是98,转换为二进制数据是01100010
  8. 因为 bit 非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
  9. */

例如:在线用户的统计,留存用户的统计

  1. setbit onlineusers 01
  2. setbit onlineusers 11
  3. setbit onlineusers 20

支持按位与,按位或等操作

  1. BITOPANDdestkeykey[key...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
  2. BITOPORdestkeykey[key...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
  3. BITOPXORdestkeykey[key...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
  4. BITOPNOTdestkeykey ,对给定 key 求逻辑非,并将结果保存到 destkey

计算出7天在线的用户

  1. BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"

购物车

常用String或者hash,所有String能实现的功能hash都可以实现

  1. 对一个商品的属性进行指定编码格式
  2. 例如:
  3. key:用户id
  4. field:商品id
  5. value:商品数量
  6. hincr:+1
  7. hdecr:-1
  8. hdel:删除
  9. hgetall:全选
  10. hlen:商品数

用户消息时间线 timeline

常用list,双向链表,插入有序列表

消息队列

常用list,使用其中的两个阻塞的弹出操作:blpop和brpop,可以设置超时时间

  • blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞直到超时或者发现可弹出元素为止
  • brpop:brpop key2 timeout 移除并获取列表的最后一个元素,如果列表没有元素,会阻塞到超时或者发现可弹出元素为止

可以根据这两个方法实现两种Java的数据结构
栈和队列

  • 栈:先进后出 rpush和brpop
  • 队列:先进先出 rpush和blpop

    抽奖

    redis获得随机值
    1. spop myset

    点赞、签到、打卡

    常用string
    点赞的操作为:点赞,取消点赞,是否点赞,查看点赞用户,查看点赞数
    假如微博 ID 是 t1001,用户 ID 是 u3001。
    用 like:t1001 来维护 t1001 这条微博的所有点赞用户
    点赞了这条微博:sadd like:t1001 u3001
    取消点赞:srem like:t1001 u3001
    是否点赞:sismember like:t1001 u3001
    点赞的所有用户:smembers like:t1001
    点赞数:scard like:t1001

签到和打卡实现类似

商品标签

常用list
直接存储即可

  • sadd tags:i5001 画面清晰细腻
  • sadd tags:i5001 真彩清晰显示屏
  • sadd tags:i5001 流程至极

    商品筛选

    常用set
    可以获取set集合的差集,交集,并集以进行筛选
    1. // 获取差集
    2. sdiff set1 set2
    3. // 获取交集(intersection )
    4. sinter set1 set2
    5. // 获取并集
    6. sunion set1 set2

    用户关注、推荐模型

    常用set,使用差集,交集,并集进行推荐查看 ```java follow 关注 fans 粉丝。

相互关注:

sadd 1:follow 2

sadd 2:fans 1

sadd 1:fans 2

sadd 2:follow 1

我关注的人也关注了他(取交集):

sinter 1:follow 2:fans 可能认识的人:

用户 1 可能认识的人(差集):sdiff 2:follow 1:follow

用户 2 可能认识的人:sdiff 1:follow 2:follow

  1. <a name="JeX2H"></a>
  2. ### 排行榜
  3. 常用int或者bit运算
  4. ```java
  5. id 为 6001 的新闻点击数加 1:zincrby hotNews:20190926 1 n6001
  6. 获取今天点击最多的 15 条:zrevrange hotNews:20190926 0 15 withscores