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("没有获取到锁"); } } }