redis特点
1.内存数据库,NOSQL典型代表,键值对存储
2.支持多种数据类型
3.可以将内存当中的数据持久化到硬盘当中
4.使用复制来扩展读性能,使用分片技术来扩展写性能
数据类型
1.string 可以存储字符串,整数,浮点数
2.list 双端队列
3.set 无序集合
4.hash 包含键值对的无序散列表
5.zset 有序集合 根据分值范围或者成员来获取元素
string
set hello world
get hello
del hello
get hello
list
{rpush,lpush,rpop,lpop,lindex,lrange}
rpush list 1 #[1]
lpush list 2 #[2 1]
rpush list 3 #[2 1 3]
lindex list 0 #get list[0] = 2
lrange list 0 -1 #[2 1 3]
rpop list #[2 1]
lpop list #[2]
set
{sadd,smembers,sismember,srem}
srem #删除元素
sadd s 1
sadd s 2
smembers s #[1 2]
sismember s 1 # 1 represents true
srem s 1 # remove item 1
hash
{hset,hget,hdel,hgetall}
hset h czs 24
hset h lpp 26 #{czs:24,lpp:26}
hgetall h #{czs:24,lpp:26}
hget h czs # 24
hdel h czs #{lpp:26}
zset 根据分值范围或者成员来获取元素
{zadd,zrange,zrangebyscore,zrem}
zadd z 100 czs
zadd z 1000 lpp
zrange z 0 -1 #[czs lpp]
zrange z 0 -1 withscores #[czs 100 lpp 1000]
zrangebyscore z 0 200 withscore #[czs 100]
数据结构
1.字典 dict
dictht #dict hash table
散列表结构,采用链地址法解决hash冲突
redis的字典dict包含两个哈希表dictht
这是为了方便进行rehash操作,将其中一个dictht上的键值对rehash到另一个dictht上,交换完后释放空间并交换两个dictht的角色
rehash操作不是一次性完成的,而是采用渐进式完成,为了避免一次性执行过多的rehash操作给服务器带来过大的负担。是通过记录dict的rehashidx完成。
2.跳跃表 提升查找性能
基于多指针有序链表实现的。可以看成是多个有序链表
与红黑树等平衡树相比,其具有以下优点:
1.插入速度非常快速,因为不需要进行旋转等操作来维护平衡性
2.更容易实现
3.支持无锁操作
使用场景
1.计数器
可以对String进行自增自减运算,从而实现计数器功能
Redis这种内存数据库的读写性能非常高,非常适合存储频繁读写的计数量
2.缓存
热点数据放在缓存当中,设置内存的最大使用量以及淘汰策略保证缓存的命中率
3.查找表
例如DNS目录就很适合使用redis进行存储
4.消息队列
List是一个双向链表,可以通过lpop和lpush写入和读取消息
5.session共享
可以使用redis来统一存储多台应用服务器的会话消息
当应用服务器不在存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一台应用服务器,从而更容易实现高可用性以及伸缩性
6.分布式锁实现
分布式场景下,使用redis自带的setnx命令来实现分布式锁,除此之外,还可以使用官方提供的RedLock分布式锁实现
7.其他
set可以实现交集,并集操作,从而实现共同好友功能
zset可以实现有序性操作,可以实现排行榜等功能
redis vs memcached
二者都是内存键值对数据库。二者有如下区别
数据类型:
memcached仅支持string类型,redis支持五种
数据持久化
memcached不支持,redis支持
分布式:
memcached不支持分布式,只能通过在客户端使用一致性hash来实现分布式存储,这种方式在存储和查询的时候都需要先在客户端计算一次数据所在的节点
redis cluster实现了分布式的支持
内存管理机制
redis中,并非所有数据都存储在内存当中,可以将一些很久没用的value交换到磁盘上,而memcached的数据则是一直处于内存当中。
memcached将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使内存的利用率不是很高。
数据淘汰策略
redis 6种
volatile-lru 从设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-random 从设置过期时间的数据集中任意挑选
volatile-ttl 从设置过期时间的数据集中挑选将要过期的数据淘汰
allkeys-lru 从所有数据集
allkeys-random 从所有数据集
noeviction 禁止驱逐数据
redis4.0 加入 LFU 策略通过统计访问频率,将访问频率最少的键值对淘汰
why redis is so fast?
1.redis 基于内存操作
2.redis使用单线程,避免了频繁的上下文切换
3.redis具有合理高效的数据结构
4.redis采用了非阻塞I/O多路复用机制
redis数据过期机制
1.定期删除策略
缺点:每次遍历内存当中的数据,非常消耗CPU资源,当Key过期,但是定时器还处于未唤醒状态,这段时间内key仍然可以使用
2.惰性删除策略
先判断key是否过期,如果国企则删除。
缺点:如果这个key一直未被使用,那么它一直在内存中,其实它已经过期,会浪费大量的空间。