2020-11-23 Redis学习笔记

一、Redis在Linux系统安装及启动:

   (1)上传redis安装包,redis-4.0.2.tar.gz,下载C语言编译环境,yum install -y gcc-c++;
   (2)将redis解压到/usr/local/redis目录下,并执行make命令,进行编译;
   (3)安装:make install
   (4)配置配置文件:将redis.config复制到redis/bin目录下,修改如下配置:

daemonize:控制是否以守护进程形式运行Redis服务器(设置为no则会直接进入命令行,无法后台运行)
logf:指定配文件路径( “/var/logs/redis.log”)
dir :redis工作目录

(5)启动redis:redis-server文件路径+redis.conf文件路径,例如
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
	(6)客户端登陆:/usr/local/redis/bin/redis-cli

二、redis常用数据类型及命令

1、redis默认16个数据库,索引从0-15

 select + 索引:切换数据库
 dbsize:查看当前数据库数据长度

2、redis以key-value键值对形式保存数据,key的类型为String,value的类型可以分为五种,其中针对key的常用命令包括:

 keys * :查询所有键
 type key :查询建的value类型
 del key :删除指定的键值对
 move key + 索引 :将key移动到指定数据库
 randomkey:随机返回一个key
 rename key newname:将key重命名
 TTL key :查看key剩余存活时间
 expire key seconds:设置key将在seconds后过期
 persist key :移除过期时间,长久保存
 exist key :判断key是否存在

3、value类型之一:
(1)字符串类型:String是Redis中最基本的类型,它是key对应的一个单一值。Redis中一个字符串值的最大容量是512M。

set key value [ex seconds] [px miliseconds] [NX|XX] : 给KEY设置一个string类型的值。
													    ex参数设置key存活seconds秒。
													    PX参数设置key存活miliseconds毫秒。
													    nx参数表示当前命令中指定的key不存在才行。
													   xx参数表示当前命令中指定的key存在才行。
get key :获取key的值
append key value :在key原值后面追加value值,并返回追加后的value
strlen key : 返回key的长度
incr key :自增1
decr key :自减1													    
incrby key +number :key的值加上number
decrby key +number :key的值减去number
getrange key start end : 截取key对应value的指定一段
setex key seconds value :设置key,value及存活时间
mget key1 key2……:一次性获取多个键的值,没有值的则返回值是(nil)
getset key value :给key设置新值,并返回旧值

(2)哈希类型:hash,其value本身即为键值对,可以当做Java中的Map<String,Object>对待
,命令与String相似

hset key field value:给KEY设置一个值,为field-value键值对
hget key filed :获取key中field的值
hlen key:返回key的长度
mget key field1 field2…… :获取key中多个field的值
hmset key field1 value1 field2 value2…… :给KEY设置多个值,为field-value键值对
hgetall key:获取key中所有key和value

(3)列表类型:list,是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。底层是基于链表实现的,所以它操作时头尾效率高,中间效率低。

lpush/rpush key value1 value2…… :将元素添加到key的左边/右边 
lrange key start end :根据指定索引范围获取元素
llen eky :同上
lpop/rpop key :从左/从右弹出一个值
rpoplpush key1 key2 :将key1从右弹出一个值,并从左加入key2
lindex key index :根据指定索引取值
linsert key before/after value1 value2 :在value1前/后添加value2
ltrim key start end :保留指定索引之间的数据,删除两端数据
lset key index value : 给指定索引的值重新赋值

需要注意的是,使用lrnage key 0 -1可以取出全部元素,是因为list从左到右是基于两套索引完成的,如下:
在这里插入图片描述

(3)set类型:set,是String类型的无序集合,它是基于哈希表实现的

sadd key member1 member2……:给KEY设置值
smembers key :获取key中所有值
scard key :获取key中所有值
sismember key member :判断key中是否包含member
srem key member1 member2 :删除key中指定元素
sinter kry1 key2……:求交集
sdiff key1 key2 :求差集
sunion key1 key2 :求并集
smove key1 key2 member:将key1中的member放入key2

(4)zset类型:zset ,和 set 一样也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。并通过分数为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)可以重复。

zadd key score member score2 member2:给KEY设置值
zcard key :获取key中所有值
zrange key start end [withscores]: 根据指定分数范围获取元素
zrem key value:删除key中value

三、持久化

1、RDB
每隔一段时间将数据持久化到硬盘,可通过配置文件中:dbfilename设置数据存储文件的文件名,通过dir配置设置文件路径。默认配置为:

save 900 1 //900秒内至少有一次修改则触发保存操作
save 300 10  //300秒内至少有10次修改则触发保存操作
save 60 10000  //60秒内至少有1万次修改则触发保存操作

也可用save命令进行保存,在使用shutdown命令正常退出时,redis也会进行一次RDB持久化。

2、AOF
redis默认不使用AOF,若要使用,需将appendalone配置改为yes,即启用AOF持久化机制,同RDB,AOF可以通过appendfilename设置持久化文件名 ,通过dir配置设置文件路径。AOF保存数据有三种设置:

appendfsync:always //每一次数据修改后都将执行文件写入操作,缓慢但是最安全
appendfsync:everysec//每秒执行一次写入操作。折中。
appendfsync:no//由操作系统在适当的时候执行写入操作,最快。

默认当AOF文件达到64MB时将会进行重写,即将持久化文件中的同一数据的多个命令合成一个,以压缩文件体积,此操作节约磁盘空间,但是会极大的占用CPU,故频繁重写得不偿失,故在使用时推荐改变AOF重写的时机,例如设置文件大小达到5G后再进行重写。

3、持久化文件修复
(1)cp备份需要修复的文件
(2)执行修复程序,例

/usr/local/redis/bin/redis-check-aof --fix /usr/local/redis/appendonly.aof

(3)重启Redis
注意:修复持久化文件仅仅是把损坏的部分去掉,而无法把受损的数据找回。

4、RDB与AOF比较
(1)存储机制不同,RDB持久化直接存储数据,而AOF存储的是产生数据的命令;
(2)RDB读取速度快,适合大量数据恢复,但是保存是按时间间隔和次数进行,此件未保存数据存在安全风险;AOF恢复速度比RDB慢,always可以保证数据的完整性和安全性,但是每次操作都进行保存则会过大暂用内存,降低使用效率。
(3)RDB和AOF并存时,将优先使用AOF。

四、redis事务

1、事务命令,如下:

multi:表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。
EXEC:执行MULTI后面命令队列中的所有命令
DISCARD:放弃执行队列中的命令
WATCH:“”观察“、”监控“一个KEY,在当前队列外的其他命令操作这个KEY时,放弃执行自己队列的命令
UNWATCH:放弃监控一个KEY

2、事务机制,与mysql等关系型数据库不同,redis对事物控制更加宽松,是一种乐观锁机制,即在执行操作前不锁定数据,万一错误发生了,那么放弃自己的操作,及发生错误后,执行过的命令不回滚,redis中存在两种错误形式:

(1)遇到了入队时即可检测到的错误,整个队列都不会执行。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age www
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

(2)错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令继续执行,并没有回滚。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age ww
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 35
3) (integer) 40
4) (error) ERR value is not an integer or out of range
5) (integer) 45
127.0.0.1:6379> get age
"45"

五、主从复制机制和哨兵

根据官网给出的图示,及一台主机负责写入,多台从服务器负责读取,这样构建集群,和哨兵机制并用则可以避免单点故障。
在这里插入图片描述
1、搭建步骤
(1)Redis集群在运行时使用的是同一个可执行文件,只是对应的配置文件不同
在这里插入图片描述
(2)设置配置文件
其中dir 配置工作目录应该一致,port、dbfilename、logfile、pidfile不同。集群相关命令如下:`

info replication  :查看主从关系
slaveof 主机ip 端口号 :设定主从关系
slaveof on one :取消主从关系

但是仅此配置存在一个问题,即主服务器出现问题后,从服务器依旧是从服务器,没有主服务器则会导致程序不可用。此时需加入哨兵模式。

2、哨兵模式
通过哨兵服务器sentinal监控master/slave实现主从复制集群的自动管理。监控机制为心跳检测。几多个Sentinal不断像master发送请求,询问master是否存活,根据是否得到回复判断主机是否宕机。若宕机,则会在剩余从机中选择一个作为主服务器。
其中存在两种情况,一个是主观下线,即一个哨兵未得到回复就认为master下线了,但这种方式显然是不合理的,因为可能存在网络波动导致一段时间内收不到回复,但此时master并未宕机。
所以另一种方式更为合理——客观下线,及当指定数量的sentinal无法接收到回复时,才认定master下线。配置哨兵如下:
格式:sentinel monitor 为主机命名 主机IP 主机端口号 将主机判定为下线时需要Sentinel同意的数量
:sentinel monitor mymaster 127.0.0.1 6000 1
启动哨兵;/usr/local/redis/bin/redis-server /usr/local/cluster-redis/sentinel.conf --sentine

注意:在原主机重启后,原master将会变成从机,即salve。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值