Redis 常见使用场景详解

一,简介

Redis 是由 Salvatore Sanfilippo  编写的一个key-value存储系统,是跨平台的非关系型数据库。Redis是一个开源的,使用C语言编写的,遵守BSD协议,支持网络,可基于内存,分布式,可选持久性的键值对(key-value)存储数据库,并且提供了多种语言的API。

 

二,特性

1.基于内存存储(不开启持久化的情况),读写性能优异

2.支持持久化

3.数据类型丰富,满足绝大部分常用的应用场景。

4.单线程

5.数据自动过期

6.发布订阅模式

7.支持分布式

 

三.,数据结构及应用场景

1.String,适合简单的key,value存储结构,类似于之前使用过的cache,memcached的存储结构。应用场景:短信验证码,配置信息等。

常用命令:

1.1 incr:自增

1.1 decr:自减

1.1 incrby:加(加上指定的值)

1.1 decrby:减(加上指定的值)

 

2.Hash ,一般key为id或者唯一标识,value存储对应的详情信息,应用场景:个人详情,商品详情等。、

2.1 hset:添加hash数据

2.2 hget:获取hash数据

2.3 hmget:获取多个hash 中key的数据

 

3.List,应为list是有序的,适合存储一些格式相对固定的数据结构,应用场景:省市区,字典信息等。

常用命令:

3.1 lpush:从左边推入

3.2 rpush:从右边推入

3.3 lpop:从左边弹出

3.4 rpop:从右边弹出

3.4 llen:查看某个list集合的长度

 

4.Set,可以理解为ID-List 模式,set最厉害的地方是可以求两个set集合的交集,并集,差集等,应用场景:相关好友,关注列表,收藏夹等。

4.1 sadd:添加数据

4.2 scard:查看set集合中元素的个数

4.3 sismember:判断set集合中是否存在某个元素

4.4 srem:删除某个元素

4.5 smembers:返回集合中所有成员

 

5.Sorted Set,set的升级版,增加了一个score参数,可以根据score参数进行排序。应用场景:排行榜数据等。

5.1 zadd:添加数据

5.2  zcard:查询元素数量

5.3 zrange:对集合进行排序

 

四,其它常用应用场景

1.分布式锁,因为redis是单线程处理,所有可以用来做分布式锁,避免数据被重复处理

.net实现代码如下:

public static void RedisLockV2()
        {
            var lockTimeout = 5000;//单位是毫秒
            var currentTime = DateTime.Now.ToUnixTime(true);

            if (SetNxV2("lockkey",DateTime.Now.ToUnixTime(true)+lockTimeout))
            {
                //设置过期时间
                redisClient.Expire("lockkey", TimeSpan.FromMilliseconds(5000));
                //TODO:一些业务逻辑代码
                
                Console.WriteLine("处理业务ing");
                Thread.Sleep(100000);

                Console.WriteLine("处理业务ed");
                //最后释放锁
                Remove("lockkey");
            }
            else
            {
                //未获取到锁,继续判断,判断时间戳看看是否可以重置并获取锁
                var lockValue = redisClient.Get("lockkey");
                var time = DateTime.Now.ToUnixTime(true);

                if (!string.IsNullOrEmpty(lockValue) &&  time> lockValue.ToInt64())
                {
                    //再次用当前时间戳getset
                    //返回固定key的旧值,旧值判断是否可以获取锁
                    var getsetResult = redisClient.GetSet("lockkey", time);
                    if (getsetResult == null || (getsetResult != null && getsetResult == lockValue))
                    {
                        Console.WriteLine("获取到Redis锁了");
                        //真正获取到锁
                        redisClient.Expire("lockkey", TimeSpan.FromMilliseconds(5000));
                        //TODO:一些业务逻辑代码
                        //.....
                        //.....
                        Console.WriteLine("处理业务");
                        //最后释放锁
                        Remove("lockkey");
                    }
                    else
                    {
                        Console.WriteLine("没有获取到锁");
                    }

                }
                else
                {
                    Console.WriteLine("没有获取到锁");
                }
            }
            
        }

 

posted @ 2022-01-17 23:11  我是太子殿下  阅读(1535)  评论(0编辑  收藏  举报