Redis
文章目录
一、Redis 安装
① 将 Redis 的 tar 包上传到 /opt/software 目录下,并解压到 /opt/module 下
② 安装 gcc 环境 redis是C语言编写的!要有gcc-c++ 环境
yum install –y gcc-c++
查看安装是否成功:rpm –qa|grep gcc
③ 查看 make 是否安装
④ 进入到 /opt/module/redis.xxx/src 目录下执行 make && make install
⑤ 安装成功,文件会被安装到 /usr/local/bin目录
二、启动
服务端启动
在家目录下创建一个 myredis 目录,将 拷贝 /opt/module/redis.xxx/redis.conf 配置文件到 myredis 中用于启动
命令: redis-server redis.conf
修改配置文件 daemonize yes,改为守护进程,使进程在后台运行。
后台启动后,查看服务: netstat –anp|grep 6379
客户端启动
redis-cli -h 服务端的hostname(默认127.0.0.1) -p 服务端端口号(6379)
命令 | 说明 | 备注 |
---|---|---|
redis-cli | 启动客户端 | 直接执行的话,默认端口号就是6379; |
ping | 测试联通 | 回复pong代表联通 |
exit | 退出客户端 | |
redis-cli shutdown | 停止服务器 | redis是通过客户端发送停止服务器的命令 |
三、Redis 基本操作
数据库连接操作
命令 | 说明 |
---|---|
select | 切换数据库,默认为[0-15] 共计16个库 |
flushdb | 清空当前库 |
dbsize | 查看数据库数据个数 |
flushall | 通杀全部库 |
key 的操作
表达式 | 描述 |
---|---|
KEYS pattern | 查询符合指定表达式的所有key,支持*,?等 |
TYPE key | 查看key对应值的类型 |
EXISTS key | 指定的key是否存在,0代表不存在,1代表存在 |
DEL key | 删除指定key |
RANDOMKEY | 在现有的KEY中随机返回一个 |
EXPIRE key seconds | 为键值设置过期时间,单位是秒,过期后key会被redis移除 |
TTL key | 查看key还有多少秒过期,-1表示永不过期,-2表示已过期 |
RENAME key newkey | 重命名一个key,NEWKEY不管是否是已经存在的都会执行,如果NEWKEY已经存在则会被覆盖 |
RENAMENX key newkey | 只有在NEWKEY不存在时能够执行成功,否则失败 |
常用的五大数据类型
Redis中的数据以键值对(key-value)为基本存储方式,其中key都是字符串,这里探讨数据类型都是探讨value的类型。
表达式 | 描述 |
---|---|
string | 字符串 |
list | 可以重复的集合 |
set | 不可以重复的集合 |
hash | 类似于Map<String,String> |
zset(sorted set) | 带分数的set |
String 操作
Redis中一个字符串值的最大容量是512M。
String类型是Redis中最基本的类型,它是key对应的一个单一值。
二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
表达式 | 描述 |
---|---|
SET key value | 添加键值对 |
GET key | 查询指定key的值 |
APPEND key value | 将给定的value追加到原值的末尾 |
STRLEN key | 获取值的长度 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
INCR key | 指定key的值自增1,只对数字有效 |
DECR key | 指定key的值自减1,只对数字有效 |
INCRBY key num | 自增num |
DECRBY key num | 自减num |
MSET key1 value1 key2 value2… | 同时设置多个key-value对 |
MGET key1 key2 | 同时获取一个或多个value |
MSETNX key1 value1 key2 value2 | 当key不存在时,设置多个key-value对 |
GETRANGE key 起始索引 结束索引 | 获取指定范围的值,都是闭区间 |
SETRANGE key 起始索引 value | 从起始位置开始覆写指定的值 |
GETSET key value | 以新换旧,同时获取旧值 |
SETEX key 过期时间 value | 设置键值的同时,设置过期时间,单位秒 |
List 操作
在Redis中,list是双向链表。可以从两侧插入,对两端的操作性能很高,通过下标操作中间的节点性能会较差。 遍历:遍历的时候,是从左往右取值;
删除:弹栈,POP;
添加:压栈,PUSH ;
表达式 | 描述 |
---|---|
LPUSH/RPUSH key value1 value2… | 从左边/右边压入一个或多个值 头尾效率高,中间效率低 |
LPOP/RPOP key | 从左边/右边弹出一个值 值在键在,值光键亡 弹出=返回+删除 |
LRANGE key start stop | 查看指定区间的元素 正着数:0,1,2,3,… 倒着数:-1,-2,-3,… |
LINDEX key index | 按照索引下标获取元素(从左到右) |
LLEN key | 获取列表长度 |
LINSERT key BEFORE|AFTER value newvalue | 在指定 value 的前后插入 newvalue |
LREM key n value | 从左边删除 n 个 value |
LSET key index value | 把指定索引位置的元素替换为另一个值 |
LTRIM key start stop | 仅保留指定区间的数据 |
RPOPLPUSH key1 key2 | 从 key1 右边弹出一个值,左侧压入到 key2 |
Set 操作
Set 是无序的,且是不可重复的。
表达式 | 描述 |
---|---|
SADD key member [member …] | 将一个或多个元素加入到集合 key,已经存在的 member 元素将被忽略。 |
SMEMBERS key | 取出该集合的所有值 |
SISMEMBER key value | 判断集合是否为含有该值,有返回1,没有返回0 |
SCARD key | 返回集合中元素的数量 |
SREM key member [member …] | 从集合中删除元素 |
SPOP key [count] | 从集合中随机弹出count个数量的元素,count不指定就弹出1个 |
SRANDMEMBER key [count] | 从集合中随机返回count个数量的元素,count不指定就返回1个 |
SINTER key [key …] | 将指定的集合进行“交集”操作 |
SINTERSTORE dest key [key …] | 取交集,另存为一个set |
SUNION key [key …] | 将指定的集合执行“并集”操作 |
SUNIONSTORE dest key [key …] | 取并集,另存为set |
SDIFF key [key …] | 将指定的集合执行“差集”操作 |
SDIFFSTORE dest key [key …] | 取差集,另存为set |
Hash 操作
常用操作:
表达式 | 描述 |
---|---|
HSET key field value | 为key中的field赋值value |
HMSET key field value [field value …] | 为指定key批量设置field-value |
HSETNX key field value | 当指定key的field不存在时,设置其value |
HGETALL key | 获取指定key的所有信息(field和value) |
HKEYS key | 获取指定key的所有field |
HVALS key | 获取指定key的所有value |
HLEN key | 指定key的field个数 |
HGET key field | 从key中根据field取出value |
HMGET key field [field …] | 为指定key获取多个filed的值 |
HEXISTS key field | 指定key是否有field |
HINCRBY key field increment | 为指定key的field加上增量increment |
Zset操作
Zset是一种特殊的 set(sorted set),在保存 value 的时候,为每个 value 多保存了一个 score 信息。默认通过 score 对元素进行排序,可以通过下标类对元素进行定位。
表达式 | 描述 |
---|---|
ZADD key [score member …] | 添加 |
ZSCORE key member | 返回指定值的分数 |
ZRANGE key start stop [WITHSCORES] | 返回指定区间的值,可选择是否一起返回scores |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 在分数的指定区间返回数据,从小到大排列 |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 在分数的指定区间内返回数据,从大到小排列 |
ZCARD key | 返回集合中所有的元素的数量 |
ZCOUNT key min max | 统计分数区间内的元素个数 |
ZREM key member | 删除该集合下,指定值的元素 |
ZRANK key member | 返回该值在集合中的排名,从0开始 |
ZINCRBY key increment value | 为元素的 score 加上增量 |
四、Redis 配置文件
单位说明
1k和1kb是不同的;单位的大小写不敏感!
include
可以将公共的配置放入到一个公共的配置文件中,然后通过子配置文件引入父配置文件中的内容!
将配置按照模块分开!
network
general
其他
五、持久化
Redis主要是工作在内存中。内存本身就不是一个持久化设备,断电后数据会清空。所以Redis在工作过程中,如果发生了意外停电事故,如何尽可能减少数据丢失。
RDB(快照存储)
RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,redis 在启动时会默认读取指定配置的快照文件,将快照文件中的数据读到内存里。
工作机制:每隔一段时间,就把内存中的数据保存到硬盘上的指定文件中。RDB是默认开启的!
RDB的缺点是最后一次持久化后的数据可能丢失。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
RDB常用属性配置:
RDB的触发:
①基于自动保存的策略
②执行 save,或者 bgsave 命令!执行时,是阻塞状态。
③执行 flushall 命令,也会产生 dump.rdb,但里面是空的,没有意义。
④当执行 shutdown 命令时,也会主动地备份数据。
RDB 自动保存策略:
save 900 1 900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10 300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000 60 秒内如果至少有 10000 个 key 的值变化,则保存
save “” 就是禁用RDB模式;
ReDB 的缺点:
RDB是全盘备份,但数据量过大时,不适合频繁进行备份。
有可能丢失最后一次备份后的数据。
AOF(日志存储)
AOF是以日志的形式来记录每个写操作,将每一次对数据进行修改,把新建、修改数据的命令保存到指定文件中。Redis重新启动时读取这个文件,重新执行新建、修改数据的命令恢复数据。
默认不开启,需要手动开启。
AOF文件的保存路径,同RDB的路径一致。
AOF在保存命令的时候,只会保存对数据有修改的命令,也就是写操作!
当RDB和AOF存的不一致的情况下,按照AOF来恢复。因为AOF是对RDB的补充。备份周期更短,也就更可靠。
保存策略:
① appendfsync always:每次产生一条新的修改数据的命令都执行保存操作;效率低,但是安全!
② appendfsync everysec:每秒执行一次保存操作。如果在未保存当前秒内操作时发生了断电,仍然会导致一部分数据丢失(即1秒钟的数据)。
③ appendfsync no:从不保存,将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
AOF 常用配置
AOF文件的修复:
如果AOF文件中出现了残余命令,会导致服务器无法重启。此时需要借助 redis-check-aof 工具来修复!
命令: redis-check-aof --fix 文件
六、事务
Redis中的事务指的是一个单独的隔离操作。
Redis事务的主要作用是串联多个命令防止别的命令插队。
Redis的事务中的所有命令都会序列化、按顺序地执行且不会被其他客户端发送来的命令请求所打断。
事务常用命令
命令 | 描述 |
---|---|
MULTI | 开始事务:标记一个事务块的开始。 |
EXEC | 执行事务:事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。 |
DISCARD | 解散事务:释放一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。 如果已使用WATCH,DISCARD将释放所有被 WATCH 的key。 |
WATCH | 锁:标记所有指定的 key 被监视起来,在事务中有条件的执行(乐观锁)。 |
说明:MULTI 开启组队,EXEC 依次执行队列中的命令。
DISCARD 中途取消组队。
Redis 只有在执行中,才可以发现错误。而在 Redis 中,并没有回滚机制,因此当符合语法的命令出错时,该命令无法执行,但不会影响其他正确命令的执行!
但是如果在编译的过程中,Redis 检测出队列中语法错误的命令,那么该组队全体取消。
锁
-
悲观锁
在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。
Redis 不支持悲观锁。Redis 作为缓存服务器使用时,以读操作为主,很少写操作,相应的操作被打断的几率较少。不采用悲观锁是为了防止降低性能。
-
乐观锁
在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。
-
Redis 中的锁的策略
Redis 采用了乐观锁策略(通过 watch 操作)。乐观锁支持读操作,适用于多读少写的情况!
在事务中,可以通过 watch 命令来加锁;使用 UNWATCH 可以取消加锁
如果在事务之前,执行了 WATCH(加锁),那么执行 EXEC 命令或 DISCARD 命令后,锁会自动释放。
七、Redis 消息订阅
命令 | 描述 |
---|---|
SUBCRIBE [频道] | 订阅频道 ,可订阅多个平道 |
PUBLISH [频道] [消息] | 向指定频道发布消息 |
订阅者订阅消息:订阅者订阅消息后,此时控制台会处于阻塞状态,用于接收发布者发布的消息。
发布者发布消息:
订阅者收到消息: