最近因为一些原因用到Redis不得不学一点,就想着记录一下学习的印记。若有不对的地方还望指出为谢。
Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)的非关系数据库,可以将存储在内存的键值对持久化到硬盘,可使用复制特性来扩展读性能。
Redis提供了五种不同数据结构类型与键(key)的映射,分别是Strng(字符串)、hash(散列)、list(列表)、set(集合)、zset(有序集合)。如下:
相应的命令:
Key的基本操作:
删除指定 key del key
获取key是否存在 exists key
获取key的类型 type key
改名 rename key newkey renamenx key newkey
查询key keys pattern pattern
匹配规则:*匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号
String类型存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型,一般做一些复杂的计数功能的缓存。
添加/修改数据 set key value 添加/修改多个数据 mset key1 value1 key2 value2 …
获取数据 get key 获取多个数据 mget key1 key2 …
删除数据 del key
判定性添加数据 setnx key value
获取数据字符个数(字符串长度) strlen key
表示运行结果(integer) 0 → false 失败、(integer) 1 → true 成功 如下图判断性加入name zhangsan 时因为前面有了故返回(integer) 0 表示已经存在
hash类型:底层使用哈希表结构实现数据存储
如field数量较少,存储结构为类数组结构否则存储结构使用HashMap结构
添加/修改数据 hset key field value (hmset key field1 value1 field2 value2 … 多个时)
获取数据 hget key field hgetall key(hmget key field1 field2 …)
删除数据 hdel key field1 [field2]
获取哈希表中字段的数量 hlen key
获取哈希表中是否存在指定的字段 hexists key field
list类型:保存多个数据,底层使用双向链表存储结构实现,允许用户从左右(left right)两端推入或弹出数据
rpush key value [value...] 将一个或者多个值推入列表的右端
lpush key value [value...] 将一个或者多个值推入列表的左端
Rpop key 移除并返回列表最右端的元素
Lpop key 移除并返回列表最左端的元素
Lrange key start end 返回指定范围内的所以元素
Lindex key offset 返回偏移量为offset的元素
set类型:以无序的的方式来存储多个各不相同的元素,与hash存储结构完全相同,但是无法启用hash中存储值的空间。
Sadd key item [item.....] 将元素加入到集合中并返回被添加元素当中原本并不存在于集合里面的元素数量
Smembers key 返回集合中所以的元素
Srem key item [item.....] 移除元素返回移除数量
Sismember key item 判断集合是否包含item数据
Scard key 获取集合数据总量
Srandmember key [count] 随机获取集合中指定数量的数据
Spop key [count] 随机移除集合中的一个元素或者指定数量并返回移除的元素
Smove source-key dest-key item 若是source-key包含item元素就从中移除item并加入到集合dest-key中,成功返回1否则返回0
求两个集合的交、并、差集
sdiff key [key ...] 返回存在于第一个集合但不存在与其他集合中的元素(数学上的差集运算)
Sinter key [key ... ] 返回那些同时存在于所有集合中的元素(数学上的交集运算)
Sunion key [key...] 返回那些至少存在于一个集合中的元素(数学上的并集计算)
求两个集合的交、并、差集并存储到指定集合中
sdiffstore dest-key key [key ...]
sinterstore dest-key key [key ...]
sunionstore dest-key key [key ...]
有序集合:存储结构和集合一样但是集合是无序的,有序集合存储着成员与分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序地获取或扫描成员和分值的命令。
zadd key score member [score member ...] 将带有给定分值的成员添加到有序集合里面
zrem key member [member ...] 从有序集合里面移除给定的成员,并返回被移除成员的数量
zcard key 获取集合数据总量
zrange key start stop 返回有序集合中排名介于start和stop之间的成员
Redis持久化介绍:
持久化就是利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 。有利于防止数据的意外丢失,确保数据安全性。
Redis提供了两种不同的持久化方法来存储数据到硬盘里,一种为快照(RDB)另外一种为只追加文件(AOF),二者可以同时使用页可以单独使用。RDB是将某一时刻的数据写入硬盘,而AOF则是不记录数据只记录操作过程。
创建快照的方法:
1、通过向Redis发送Save命令来创建一个快照,收到Save命令后Redis在快照完成之前不在响应其他的命令,故当cpu执行的时候会阻塞redis服务器直到它执行完毕,所以说不建议大家在线上环境使用该指令。
2、通过向Redis发送Bgsave命令来创建一个快照,Redis会调用fork函数来进行创建一个进程,创建的子进程负责将快照写入硬盘,父进程继续处理其他命令。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事情。刚开始共享内存直到父进程或者子进程写入内存后对被写如的内存才会结束共享。
3、若设置了save配置选项,当任意一个save配置选项被满足时Redis就会触发一次bgsave命令
设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化
save second changes 其中second:监控时间范围 changes:监控key的变化量
Save配置:
设置本地数据库文件名,默认值为 dump.rdb
dbfilename filename
设置存储.rdb文件的路径
Dir path
设置存储至本地数据库时是否压缩数据,默认yes
rdbcompression yes|no
设置读写文件过程是否进行RDB格式校验,默认yes
rdbchecksum yes|no
bgsave指令相关配置
后台存储过程中如果出现错误现象,是否停止保存操作,默认yes
stop-writes-on-bgsave-error yes|no
4、通过Shutdown命令请求Redis关闭服务器请求,会执行save命令,堵塞客户端,并在执行完save后关闭服务器。
AOF持久化:
AOF持久化以独立日志的方式以追加每次命令,重启时再重新执行AOF文件中命令 就可以恢复AOF文件记录的数据集。
启动AOF相关配置:
开启AOF持久化功能,默认no appendonly yes|no
AOF持久化文件名,默认文件名为appendonly.aof appendfilename filename
AOF持久化文件保存路径 dir
AOF写数据策略,默认为everysec appendfsync always|everysec|no
AOF写数据三种策略(appendfsync)
always(每次):每个命令都要同步写入硬盘,这样会严重降低Redis的速度。
everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,在系统突然宕机的情况下丢失1秒内的数据 数据准确性较高,性能较高,也是默认配置
no(系统控制):由操作系统决定何时进行同步到AOF文件
AOF重写:
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。用户可以向Redis发送bgrewriteaof(手动重写)命令,这个命令通过移除AOF文件冗余命令重写AOF文件,让AOF文件尽可能的小。原理是:Redi创建一个子进程,然后由子进程负责对AOF文件进行重写。这样就会造成内存占用问题和性能问题。为此可以通过设置auto-aof-rewrite-percentage选项和auto-aof-rewrite-min-size size选项来自动执行bgrewriteaof命令。