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。

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"
LIST

 

 

Hash(字典)

Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

 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"
Hash

 

 

Set(集合) 

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

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

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

 

 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"
SET

 

Sorted Set(有序集合)

 

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

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

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

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

 

 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"
SET有序集合

 

posted on 2019-08-13 22:17  JAVA-ROAD  阅读(234)  评论(0编辑  收藏  举报

导航