Redis基础知识点
什么是Redis
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps
Redis单线程好处
代码更清晰,处理逻辑更简单
不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
不存在多进程或者多线程导致的切换而消耗CPU
所以redis线程是安全的
分布式锁
验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交
秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”
全局增量ID生成,类似“秒杀”
Redis基本数据类型
Redis目前支持5种数据类型,分别是:
String(字符串)
List(列表)
Hash(字典)
Set(集合)
Sorted Set(有序集合)
下面就分别介绍这五种数据类型及其相应的操作命令。
String(字符串)
String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
应用场景:
String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。
redis 127.0.0.1:6379> SET mykey "redis" OK redis 127.0.0.1:6379> GET mykey "redis"
List(列表)
Redis列表是简单的字符串列表,可以类比到C++中的std::list,简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40亿个元素。
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
应用场景
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者push,消费者pop/bpop。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1redis127.0.0.1:6379>LPUSHrunoobkeyredis2(integer)13redis127.0.0.1:6379>LPUSHrunoobkeymongodb4(integer)25redis127.0.0.1:6379>LPUSHrunoobkeymysql6(integer)37redis127.0.0.1:6379>LRANGErunoobkey010891)"mysql"102)"mongodb"113)"redis"
Hash(字典)
Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 127.0.0.1:6379> HMSET runoobkey name "redis tutorial" 2 127.0.0.1:6379> HGETALL runoobkey 3 1) "name" 4 2) "redis tutorial" 5 3) "description" 6 4) "redis basic commands for caching" 7 5) "likes" 8 6) "20" 9 7) "visitors" 10 8) "23000"
Set(集合)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 redis 127.0.0.1:6379> SADD runoobkey redis 2 (integer) 1 3 redis 127.0.0.1:6379> SADD runoobkey mongodb 4 (integer) 1 5 redis 127.0.0.1:6379> SADD runoobkey mysql 6 (integer) 1 7 redis 127.0.0.1:6379> SADD runoobkey mysql 8 (integer) 0 9 redis 127.0.0.1:6379> SMEMBERS runoobkey 10 11 1) "mysql" 12 2) "mongodb" 13 3) "redis"
Sorted Set(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 redis 127.0.0.1:6379> ZADD runoobkey 1 redis 2 (integer) 1 3 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb 4 (integer) 1 5 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql 6 (integer) 1 7 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql 8 (integer) 0 9 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql 10 (integer) 0 11 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 12 13 1) "redis" 14 2) "1" 15 3) "mongodb" 16 4) "2" 17 5) "mysql" 18 6) "4"