Redis-基础
Redis
为什么要使用Redis?
在一些业务场景下,CRUD操作80%都是查询,只有20%涉及到增、删、改操作。数据并不需要频繁变更,使用缓存会提高查询效率。
Redis值的数据类型?
string(字符串)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)
1、Redis常用命令
exit 退出
?
shutdown 停止服务
?
set [key] [value] 设置数据
?
get [key] 获得key的值
?
del [key] 删除
?
keys 查看符合规则的键(支持通配符)
?
select 切换数据库(Redis有16个数据库)
?
exists [key] 判断键是否存在(存在 1,不存在 0)
?
type [key] 查看值的数据类型
?
flushall 清空所有数据库
?
flushdb 清空当前数据库
?
注:在同一个库下设置相同的key会覆盖
set、setnx、setex的区别
(1)、SET key value
含义:
将字符串值 value 关联到 key 。
如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
(2)、SETEX key seconds value
含义:
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
如果 key 已经存在, SETEX 命令将覆写旧值。
返回值:
设置成功时返回 OK 。
当 seconds 参数不合法时,返回一个错误。
(3)、SETNX key value
含义:
将 key 的值设为 value ,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
返回值:
设置成功,返回 1 。
设置失败,返回 0 。
(4)、GETSET key value
含义:
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
当 key 存在但不是字符串类型时,返回一个错误。
返回值:
返回给定 key 的旧值。
当 key 没有旧值时,也即是, key 不存在时,返回 null 。
2、Redis数据类型----字符串
Redis中存放的字符串是以二进制存储的。字符串长度支持到512M。
incr [key] / incrby [key] [num] 自增1 / 自增num
?
decr [key] / decrby [key] [num] 自减1 / 自减num
?
incrbyfloat [key] [num(浮点数)] 加浮点数(整数加浮点数计算正确,浮点数加浮点数会有精度问题)
?
append [key] [value] 在字符串后添加数据
?
strlen [key] 查看字符串长度
?
mset [key1] [val1] [key2] [val2]..... / mget [key1] [key2] .... 设置、查看多个数据
3、Redis数据类型---hash结构
散列类型存储了字段到字段值的一种映射。字段值只可为字符串,不能是其他数据类型。一个散列类型最多可包含 2的32次方-1 个字段。
hset [key] [字段名] [字段值] 设置数据
?
hget [key] [字段名] 查看字段值
?
hgetall [key] 查看字段以及字段值
?
hincrby [key] [字段名] [num] 字段增加num
?
hmset [key] [字段名] [字段值] [字段名] [字段值] ... / hmget [key] [字段名] [字段名]... 批量设置、查看
?
hexists 属性是否存在
?
hdel 删除
?
hkeys / hvals 单独获取字段名/字段值
?
hlen 元素个数
4、Redis生存时间
ttl [key] 查看过期时间(-1没有过期时间,-2被移除)
?
expire [key] [seconds] 设置过期时间(秒)
?
persist [key] 取消过期时间
?
pexpire [key] [milliseconds] 设置过期时间(毫秒)(更加准确的控制,适用于高并发)
5、Redis持久化
RDB
RDB是把当前进程的数据生成快照保存到硬盘。首先Redis会单独创建(fork)一个子进程来进行持久化,现将数据写入到一个临时文件中,持久化过程结束后,把临时文件替换掉上次持久化保存的文件。这个过程中主进程是不进行I/O操作的。确保了Redis的执行效率。触发RDB快照持久化分为手动触发与自动触发。
Fork的作用是复制一个与当前进程一样的进程,新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一样,但是是一个全新的进程,并作为原进程的子进程。
(1)手动触发
执行save命令后(save命令只管保存,会阻塞进程)
执行bgsave命令后(异步执行快照操作,对客户端请求无影响,可通过lastsave命令获取最后一次成功执行快照的时间)
执行flushall命令后(会产生空的dump.rdb文件,因此无意义)
执行shutdown命令后
(2)自动触发
redis.conf配置文件中配置。save m n 在m秒内有n次修改时 持久化。
优势:
(1)全量备份,粒度较大。
(2)Fork一个子进程备份数据。主进程不进行I/O操作,确保主进程效率。
(3)RDB在恢复大数据量数据时比AOF快。
劣势:在持久化过程中,主进程更改数据,子进程不会感知。会造成数据丢失。
AOF
Redis将执行每一个写命令都通过write函数追加到文件中,相当于记录一个写命令日志。需要恢复数据的时候执行所有命令即可。
文件重写
AOF的持久化方式会使持久化文件越来越大,为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时fork出一个新进程来将持久化文件重写。
触发机制
(1)每修改同步always:同步操作,每次发生数据变更时会被立即记录到磁盘,性能差但数据完整。
(2)每秒同步everysec:异步操作,每秒记录,会有1秒内的数据丢失。
(3)不同步no:不同步
优势
(1)AOF可以更好的保护数据不丢失,一般每隔一秒记录日志,最多有一秒的数据丢失。
(2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
(3)AOF日志文件过大时,会触发重写操作,不会影响客户端的读写操作。
(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。
劣势
(1)同一份数据,AOF的文件比 RDB的快照文件大
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的。
原文:https://www.cnblogs.com/mooniii/p/15184974.html