介绍:
基于内存的、key-value类型的、数据库 ;多种数据结构 ;
定期通过异步操作吧数据库数据flush到硬盘
性能:每秒可以处理超10W次读写请求
相关常用命令:
set k1 111
exist k1
del k1
ttl 返回键的剩余过期时间
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
expire k1 10 设置10S过期时间
type k1
lpush list1 "1" 插入到列表
数据类型:
1、string类型
实际可以是字符串或者数字
可以设置过期时间;计数incr k1;
应用场景:缓存或计数器
2、Hash类型 (散列类型)
设置:
hset user name zhansan
hset user age 28
取值:
hget user name
hget user age
使用场景
存储用户信息或商品信息
我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:
第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。也就是说,Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。
3、List类型
目的:存储有序的字符串列表
结构:列表类型内部使用的是双向链表
操作:向列表两端添加元素push和弹出元素pop
命令:lpush rpush lrange-从右到左获取列表的所有元素
使用场景:商品列表、菜单列表
4、set类型
特点:不重复且没有顺序
命令:
sadd s1 a b c d
求交集sinter
求并集sunion
使用情景:
- 利用值的唯一性,和集合提供的,对两个集合间的数据进行交集、并集、差集运算的操作,来推荐好友和获取共同好友等
- 利用值的唯一性,可以统计访问网站的所有独立 IP
5、zset
介绍:有序集合;每个元素都关联一个分数;
能够获得分数最高或最低的前N个元素、获取指定分数范围的元素
底层:
所以ZSet采用了一种跳跃表的实现。这个实现有点类似于Kafka存储消息是使