Redis introduction(C语言编写的)
http://www.redis.cn/ 中文网
Redis is an open source (BSD licensed), in-memory data structure
store, used as a database, cache and message broker.
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。 It supports data structures
such as strings, hashes, lists, sets, sorted sets with range queries,
bitmaps, hyperloglogs, geospatial indexes with radius queries and
streams.
它支持诸如字符串、散列、列表、集、带范围查询的排序集、位图、hyperloglog、带半径查询和流的地理空间索引等数据结构。 Redis
has built-in replication, Lua scripting, LRU eviction, transactions
and different levels of on-disk persistence, and provides high
availability via Redis Sentinel and automatic partitioning with Redis
Cluster. Redis具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis
Sentinel和带有Redis集群的自动分区提供高可用性。
Redis有五种数据结构
Redis的存储格式是key-value形式的,key是字符串(key是唯一的,如果重复,就会覆盖),value是有五种不同的数据结构。Redis有16个数据库。
value的数据结构:1.字符串类型 string
2.哈希类型 hash 相当于java中的map格式
3.列表类型 list(允许重复,有序) 相当于java中的linkedlist格式
**list有序:**这里指的是存取有序。(先进先出:栈)
4.集合类型 set(不允许重复,无序)
5.有序集合类型 sortedset(不允许重复,有序)
**有序的原理是:**每设置一个值时,会设置一个double类型的分数。可以根据该分数进行一个排名。
Redis对小key没法设置过期时间,只能对大key设置过期时间
一、Redis的两种持久化方式(RDB快照、AOF日志)
1.1、RDB快照(默认开启的)
定义:对存储在内存中的数据,周期性的进行持久化到磁盘上。
问题:为什么不实时持久化而是周期性的?
答:因为每次持久化会IO磁盘化消耗CPU的性能,频繁的IO磁盘化会造成其他服务终止。
1.1.2、优点
1.1.2.1、恢复数据速度快
1.1.2.2、RDB文件小
1.1.3、缺点
1.1.3.1、数据丢失风险大(在两次存储时间之间宕机,数据就会丢失)
1.1.3.2、当有大量数据时,进行IO磁盘化,会耗费大量的CPU性能。会造成其他服务终止。
1.1.3.3、文件不可读。
1.2、AOF日志(默认没有开启)
定义:对数据操作的指令进行持久化。
1.1.2、优点
1.1.2.1、 数据丢失风险小
1.1.2.2、AOF文件可读
1.1.3、缺点
1.1.3.1、AOF文件大(Redis自身有一个自动瘦身的指令 bgrewriteaof(原理是:例如修改多次后,只需记录最后一次修改语句即可))
1.1.3.2、恢复数据速度慢
如果两个都开启后,重启后只加载AOF日志文件。
二、Redis的内存淘汰策略
面试题:如果Redis的内存数据满了以后,下一条数据怎么存?
答:默认的内存淘汰策略是报错。
2.1、Redis占用的内存空间可以设置吗?可以的!
三、缓存穿透
3.1、概念描述:一直访问一个Redis中不存在的数据
3.2、解决办法:1、可以给每个不存在的数据进行缓存。2、只查询缓存,不查询数据库。
四、缓存击穿
4.1、概念描述:对Redis的一个数据访问量大,这时正好这个数据过期,导致对数据库的访问增大。
4.2、解决办法:1、对热点数据不设置过期时间。2、互斥锁(lock锁的trylock())
五、缓存雪崩
5.1、概念描述:某一个时间点,缓存集中过期
5.2、解决办法:1、不要把数据设置的过期时间一样,按照业务来把数据设置成不同的过期时间。2、只查Redis,不查数据库。
内存淘汰(置换)策略 : 1). volatile-lru -> remove the key with an expire set
using an LRU algorithm只从设置失效(expire set)的key中选择最近最不经常使用的key进行删除,用以保存新数据 2). allkeys-lru -> remove any key according to the LRU algorithm 优先删除掉最近最不经常使用的key,用以保存新数据 3). volatile-random -> remove a random key with an expire set 只从设置失效(expire set)的key中,(随机)选择一些key进行删除,用以保存新数据 4). allkeys-random -> remove a random key, any key 随机从all-keys中(随机)选择一些key进行删除,用以保存新数据 5). volatile-ttl -> remove the key with the nearest expire time (minor TTL) 只从设置失效(expire set)的key中,选出存活时间(TTL)最短的key进行删除,用以保存新数据 6). noeviction -> don't expire at all, just return an error on write operations 不进行淘汰,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error