Redis-基础

时间:2021-08-25 18:28:42   收藏:0   阅读:9

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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!