redis典型应用场景

目录

一、字符串

二、哈希

三、列表

四、集合

五、有序集合

六、其它


在windows下使用命令行;新建.bat文件,内容如下:

start cmd /k "d: && cd D:\Program Files (x86)\Redis-x64-2.8.2402 && redis-cli -h 47.12.1.161 -p 6379 -a 2019R09Tdse28r"

说明:切换到d:磁盘分区下,切换到redis客户端安装目录下,执行客户端工具命令

-h:主机IP

-p:端口号

-a:密码,没有设置密码的可以去掉-a

一、字符串

1、说明

以key-value的方式存储数据。
2、应用场景

      2.1 记录状态

             通过SETBIT命令设置偏移量来实现。

             setbit userStatus 100  1  (将用户ID为100的用户设置为在线状态)

             例如:用户是否在线,用户是否观看过某篇文章或者视频等

      2.2 统计

               将value值设置为整数类型,使用 INCR命令来实现value增长。

               例如:统计在线用户数量,统计文章阅读量等。

      2.3 限制用户/IP访问次数;只能粗略控制,如需精确控制则使用list列表,详见下方

               例如:限制一个ip一分钟之内最多只能访问30次后台

       将value值设置为整数类型,使用 INCR命令来实现value增长。并使用expire设置过期时间;需使用事务

               思路如下:

if(exists limit:ip) //如果存在limit:ip
    if(incr limit:ip > 30) //如果limit:ip已经>30
         return "访问太频繁了";
else
    multi //开启redis事务
    incr limit:IP
    expire limit:IP 60   //设置一分钟过期
    exec   //执行事务

       2.4 缓存数据

                用户登陆token、热点数据等  

       2.5 手机验证码

              设置用户登陆手机验证码(五分钟过期):  setex login:18046XXXX  300 684953

       2.6 生成自增ID

              数据库分表水平拆分,使用INCR生成数据库全局唯一ID

       2.7 分布式锁               

              利用setnx key value实现,当key不存在的时候会返回1,否则返回0;

              基本思路如下: 可以使用各自语言的redis客户端版本实现;java:redission  .net:StackExchange.Redis 等

string guid = Guid.NewGuid.ToString();
if("setnx product_001 guid" ==1) //并设置过期时间,防止异常死锁 [必须保证原子性,使用事务multi]
 {
     //开启[守护线程]去给redis key续期。
     ///业务逻辑 。。。。//注意抛异常情况,请使用try catch finally
 
     //redis超时时间<代码执行时间的时候,当前线程删除了其它线程的锁
     if("get product_001" == guid)
          del  product_001; 
}

//以上只针对单应用redis。 redis集群可以使用redlock

二、哈希

1、说明

一个string类型的field和value的映射表,适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
2、应用场景

2.1 存储、读取、修改对象

             例如:存储用户ID为100,姓名为小熊,电话为1804152XXXX,性别为男的用户信息

                        HMSET userInfo:100  userName 小熊  userPhone 1804152XXXX  sex 男

2.2 使用HEXISTS 命令判断是否存在(也可以用集合的SISMEMBER命令来实现)

      例如:新增菜品的时候不能存在重复的菜品名称;使用菜品名称作为hash的key,菜品ID作为hash的value

                新增数据:  HSET foodName 酸菜鱼  1  辣椒炒肉 2

                判断是否存在:HEXISTS  foodName 酸菜鱼

三、列表

1、说明

            Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

            一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
2、应用场景

2.1 构造队列 

            使用lpush和rpop实现队列

2.2 构造栈

             使用lpush和lpop实现栈

2.3 记录前五百最新登陆用户ID

              使用lpush追加用户ID,ltrim test 0 499 截取保留最新五百名 

2.4 限制用户/IP访问次数,此方法会出现竞态条件,可以通过脚本功能避免。

      例如:限制一分钟只能访问三十次

int len = llen limit:ip
if(len < 30) //如果长度小于30,则允许访问,将当前之间加入到列表中
  lpush limit:ip now()
else 
  datetime dt =   lindex limit:ip -1 //获取最先加入列表中的日期
  if(now() - dt < 60) //如果在一分钟之内
        return "访问太频繁了";
  else
        lpush limit:ip now()
        ltrim limit:ip  0  29  //只保留三十个记录

2.5 优先级队列;使用命令:brpop key [key1] [key2] timeout
             假如同时有三个列表:t1、t2、t3;任务优先级:t1 > t2 > t3;

      例如:brpop t1 t2 t3  0;当t1有任务的时候会优先取t1里面的值,否则取t2,再取t3。

四、集合

1、说明

            Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

            Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

            集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
2、应用场景

      2.1 共同好友

            使用sinter xiaoxiongFriends xiaowangFriends计算交集的方式得到两个人的共同好友列表

      2.2 点赞功能(取消点赞、防止多次点赞,检查用户是否点过赞)

            集合中的成员是唯一的,可以限制一个人多次点赞。

             sadd userID  sceneID  返回1点赞成功,返回0重复点赞

      2.3 统计访问网站的所有ip 

      2.4 抽奖功能

          存入参与抽奖的用户:  SADD user1 user2 user3

          随机抽取固定中奖人数:SRANDMEMBER key [count]    //不会删掉返回的人

                                                  SPOP key [count]    //会删掉返回的人,防止同一人抽到多个奖

五、有序集合

1、说明

            Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

            不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

            有序集合的成员是唯一的,但分数(score)却可以重复。

            集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
2、应用场景

      2.1 访问排行榜

             将商品ID为200的商品访问量增一: zincrby commodityOrder  1 200

六、其它

1、GEO实现附近的人、附近的车、附近的店

           Redis 3.2 版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

发布了65 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26900081/article/details/103072331