数据库--Redis
Redis是C语言编写的、非关系型(NoSQL)键值数据库,可以存储键和五种不同类型值之间的映射。键类型为字符串,值的类型可以为:字符串STRING、列表LIST、集合SET、散列表HASH、有序集合ZSET。
与传统数据库不同的是Redis的数据是存在内存中的,因此读写的速度非常快,所以Redis被广泛应用于缓存方向。每秒可以处理超10万次读写操作,是已知性能最快的键值数据库,而且Redis还常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
STRING
set key_name value; //向键为key_name加入值value
get key_name;//查询key_name的值
del key_name;//删除名称为key_name的键值对
LIST(允许值重复)
rpush key_name value;//向键为key_name加入值value
lrange key_name 0 -1 查询键为key_name的所有值
lindex key_name x;//查询键为key_name的第x+1条目的值
lpop key_name;//移出键为key_name对应的链表头
SET(值不允许重复)
sadd key_name value;//向键为key_name加入值value
smembers key_name;//查询键为key_name的所有值
sismember key_name value;//查询数据库中是否有键为key_name,值为value的条目
srem key_name value;//删除键为key_name,值为value的条目
HASH(值不允许重复)
hset key_name sub_key value;//加入键为key_name,子键为sub_key,值为value的条目
hgetall key_name;//查询键为key_name中所有的条目
hdel key_name sub_key;//删除键为key_name,子键为sub_key的所有条目
hget key_name sub_key;//得到键为key_name,子键为sub_key的值
ZSET(不允许值重复)
zadd key_name value;//向键为key_name加入值value
zrem key_name value;//删除键为key_name,值为value的条目
list可以有重复的值,set、ZSET不能有重复的值。
Hash的值和键有关系,键不相同
Redis有很多特性:
1、将内存中的数据持久化到硬盘中;
2、使用复制来扩展读性能;
3、使用分片来扩展写功能。
Redis优缺点:
优点:
1)读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
2)支持数据持久化,支持AOF和RDB两种持久化方式。
3)支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
4)数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
5)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点:
1)数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2)Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
3)主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
4)Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
Redis是内存型数据库,这是为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。它主要有RDB、AOF两种持久化。
RDB:将某个时间点的所有数据都存放到硬盘上。可以将快照复制到其他服务器,从而创建具有相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。如果数据量大,保存快照的时间会很长。
注:快照:将内存中的数据不断写入磁盘。
redis的数据结构
字典(dict)
哈希表(dictht)是一个散列结构,使用拉链法解决冲突
Redis的字典(dict)中有两个哈希表,这是为了方便进行rehash操作。在扩容的时候,将其中一个哈希表的键值对rehash到另一个哈希表上面,之后再释放空间并交换两个哈希表的角色。
注:rehash操作不是一次完成的,而是渐进的方式,这是为了防止一次过多的rehash操作给服务器带来过大的负担。
渐进式rehash通过记录字典(dict)的 rehashidx 完成,它从 0 开始,然后每执行一次 rehash 都会递增。例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],这一次会把 dict[0] 上 table[rehashidx] 的键值对 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。在 rehash 期间,每次对字典执行添加、删除、查找或者更新操作时,都会执行一次渐进式 rehash。采用渐进式 rehash 会导致字典中的数据分散在两个哈希表上,因此对字典的查找操作也需要到对应的哈希表去执行。
跳跃表
是有序集合的底层实现之一。跳跃表是基于多指针有序链表实现的,可以看成多个有序链表。在查找时,从上层指针开始查找,找到对应的区间之后再到下一层去查找。
与红黑树相比:跳跃表:
1.插入速度快,因为不需要进行旋转操作来维护平衡
2.更容易实现
3.支持无锁操作
redis的使用场景
计数器:可以对String进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。
缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。
原文链接:https://thinkwon.blog.csdn.net/article/details/103522351