Redis基础学习
1.redis注意点
- redis是单进程的
- 默认有16个数据库,编号为0-15
- 进入相应数据库:
select num
- 查看数据库的key数量:
dbsize 或者 keys*
- 删除当前库&删除所有库:
flushdb & flushall
2.redis数据类型
五大数据类型: String
Hash
List
Set
Zset
2.1.key操作
- 判断key存在操作:不存在,返回0;存在,返回1
exists key
- 移动key到其他库
move key db
- 为给定的key设置过期时间
expire key 秒数
- 查看还有多少秒过期,-1为永不过期,-2为已过期
ttl key
- 查看key的数据类型
type key
- 删除key
del key
2.2.String类型
- 设置/获取/删除/添加/查看长度
set/get/del/append/strlen key (value)
- 值为数字进行加减incr/incrby/decr/decrby
incr/decr key:每次加减1
incrby/decrby key num:每次加减num
- 获取一个value指定区间范围的值,(between....and),其中从零到负一代表全部
getrange key num(start) num(end)
- setrange key num XXX 设置key所对value值从第num位开始变为XXX
setrange key num XXX
- 设置某一个有效时间的key(setex:set with expire)
setex key 有效时间 value
- 如果不存在该key则设置为该value(setnx:set if not exist)
setnx key value
- 同时设置/获取N个key-value
mset/msetnx key1 value1 key2 value2 ...
mget key1 key2 key3 ...
2.3.List列表操作
- 正序插入(最后插入的放栈底)/倒序插入(最后插入的放栈顶)/获取list范围的值(其中从0到-1代表全部)
rpush/lpush list(key) value1 value2 ...
lrange list(key) num(start) num(end)
- 弹出栈顶/栈底的值
lpop/rpop list(key)
- 按照索引下标获取元素,index范围:[0-(length-1)]
lindex list(key) index
- lren key 删除N个相同的value
lren list(key) num value
- 截取指定范围值再赋值给该key,index范围:[0-(length-1)]
ltrim key index(start) index(end)
- 将源列表栈底元素插入到目的列表的栈顶
rpoplpush list1(源) list2(目的)
- 替换list中某下标的值,index范围:[0-(length-1)]
lset key index value
- 将某值(value1)插入到list中某值(value)的前/后
linsert list(key) brfore value value1
linsert list(key) after value value1
2.4.Set集合操作
- 设置/获取/该value是否为该集合的值(返回结果 0:不是,1:是)
sadd key value1 value2 ...
smembers key
sismember key value
- 获取集合中元素个数
scard key
- 删除集合中的元素
srem key value
- 随机获取集合中num个元素
srandmember key num
- 随机出栈
spop key
- 将set1集合中的元素value移动到set2
smove set1 set2 value
- 数学结合类操作
- 差集:获取在第一个集合(set1)中,不在第二个集合(set2)中的元素
sdiff set1 set2
- 交集:同时在第一个集合(set1)和第二个集合(set2)中
sinter set1 set2
- 并集:第一个集合(set1)和第二个集合(set2)中所有的元素(去重)
sunion set1 set2
2.5.Hash哈希操作(KV模式不变,但V是一个键值对)
- 设置/获取/设置多个/获取多个/删除V hash1元素
hset hash1 id idval
hget hash1 id
hmget hash1 id idval name nameval age ageval
hmget hash1 id name age
hgetall hash1
hdel hash1 id(或name ...)
- 获取hash1元素个数
hlen hash1
- 判读hash1中某个key是否存在(0:不存在 1:存在)
hexists hash1 key
- 获取hash1的所有的key/value
hkeys hash1
hvals hash1
- 为hash1中的key的value增加num(整数/小数)
增加整数:hincrby hash1 key num(int)
增加小数:hincrbyfloat hash1 key num(float)
- hash1中不存在该key时才会创建(0:失败,1:成功)
hsetnx hash1 key value
2.6.Zset有序集合操作
在set基础上。加了一个score值
之前set是k1 v1 v2 v3 ...
现在zset是k1 score1 v1 score2 v2 ...
- 设置添加
zadd zset1 score1 v1 score2 v2
- 根据value下标值获取值得范围:(num:value下标值;withscores:带score值输出)
zrange zset1 0 -1
zrange zset1 0 -1 withscores
zrange zset1 num(start) num(end)
- 获取score的范围
zrevrangebyscore zset1 start end
score范围:start <= value <= end
zrevrangebyscore zset1(start (end
范围:start < value < end
zrevrangebyscore zset1 start end limit 2 3
从结果中第二个开始截取3个返回
- 删除zset1某个元素(该元素的score一块删除)
zrem zset1 v1
- 获取zset1的元素数量
zcard zset1
- 根据score的范围获取value对应的下标值
zcount zset1 score1 score2
- 根据value值获取下标
zrank zset v1
- 根据zset1 的value值获取对应的score值
zscore zset1 v1
- 逆序(倒序)获取value下标值:将值倒序排列,获取其下标值
zrevrank zset1 v3
- 根据范围正序/逆序获取value值
zrange zset1 0 -1
zrevrange zset1 0 -1
- 逆序根据score获取value
zrevrangebyscore zset1 score2 score1
3.redis配置文件
- Units单位
1.配置文件单位,开头定义一些基本的度量单位,只支持bytes,不支持bit
2.不区分大小写
- includes部分
include包含:redis.conf作为一个总闸,包含其他redis配置文件
- general部分
- snapshotting快照
1.save:可以直接手动备份
2.stop-writes-on-bgsave-error:当后台保存出错时,前台停止再写入。
3.rdbccompression:对磁盘中的快照,是否进行压缩存储,若yes,则使用LZF算法进行压缩
4.rdbchecksum:存储快照后,使用CRC64算法检验数据
5.dbfilename:默认保存的文件名
6.dir:保存路径
- security部分
设置密码/操作有密码权限的redis
config set requirepass password
auth password
- redis启动路径
config get dir
- limits限制
- maxClients 10000:默认可连接的最大客户端数量
- maxmemory:最大的内存
- maxmemory-policy:最大内存策略
可选值:
volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放
allkeys-lru:从数据集中(包括设置和未设置过期时间的),选择最近醉酒未使用的数据释放
volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放
allkeys-random:从数据集中(包括设置和未设置过期时间的),随机选择一个数据进行释放
volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放
noeviction:不删除任何数据(redis还会根据引用计算器进行释放),若内存不够时,直接返回错误
LRU算法:
最近最久未使用算法,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,LRU算法就提供了一种策略,选择最近一段时间内,最久未使用的对象将其淘汰。- maxmemory-samples:设置样本的数量,进行测试。redis会默认检查这么多个key并选择其中的LRU的那个。
- APPEND ONLY MODE
1.appendonly:默认为no,yes开启aof的持久化
2.appendfilename:默认保存的文件名
3.appendfsync:储存方式(策略)
always:数据持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。
everysec:默认设置,异步操作,每秒记录,如果一秒内宕机,有数据丢失
no:不记录
4.no-appendfsync-on-rewrite:重写时是允许appendfsync,默认no,保证数据安全性
5.auto-aof-rewrite-percentage:当前aof文件比上次重写的增长比例大小,默认一倍
6.auto-aof-rewrite-min-size:最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.
4.redis持久化(Redis Persistence)
- rdb(Redis DataBase)
1.在指定时间间隔内,将内存中的数据集写入本地磁盘
2.redis单独创建(fork)一个子进程进行持久化,会先写入到一个临时文件,待持久化结束后,再替换原来的源持久化文件。
3.恢复Snapshot快照,将数据集从磁盘读回内存
4.rdb保存的是dump.rdb文件
5.当redis执行关闭shutdown或flushall时,会迅速截断,生成dump.rdb文件,但是由于内存已经清空,所以保存的dump.rdb为空文件。
6.可以使用save
命令自动备份。
7.如何恢复:将备份文件移动到redis安装目录并启动服务即可,config get dir 获取目录
- aof(Append Only File)
1.以日志的形式记录每个写操作,将redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取文件重构数据。即根据日志文件的内容将写指令全部执行一遍以完成数据恢复工作。
2.aof保存的是appendonly.aof
3.异常恢复:redis-check-aof --fix进行修复,之后重启
4.rewrite:aof会采取文件追加,文件会越来越大,避免出现如此,新增重写机制,当aof文件大小超过设计阈值,redis会启用aof文件内容压缩,只保留可恢复数据的最小值指令集,可以使用命令bgrewriteaof
5.redis会记录上次重写时aof大小,默认配置是当aof文件是上次重写后大小的一倍且文件大于64M时触发
6.aof运行效率慢于rdb;aof村粗配置灵活
- 总结&使用
1.rdb持久化方式是指定的时间间隔对你的数据快照存储
2.aof持久化是记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始数据,aof命令以redis协议追加保存每次系的操作到文件末尾。redis还能对aof文件进行后台重写,使aof文件不至于体积过大。
3.只做缓存使用:若仅当数据在服务器运行的时候存在,可以不使用任何持久化方式。
5.redis事务
- 事务
一次执行多个命令,一个事务中所有的命令都会序列化,按顺序串行的执行而不被其他命令插入。
- 作用
一个队列中,一次性、顺序性、排他性的执行一系列命令。
- 使用
1.diacard:取消事务,放弃执行事务块内的所有命令。
2.exec:执行所有事务块内的命令。
3.multi:标志一个事务的开始。
4.unwatch:取消watch命令对所有key的监视。
5.watch:监视一个(或多个)key,若执行事务前,key值被其他命令所改动,事务被打断
乐观锁:锁每条记录,为每条记录添加版本号,当只有修改数据冲突时,才需要重新去服务器拿被修改最新版本数据重新修改。
悲观锁:在数据被使用的时候,不允许其他人再使用。直至锁解除。
CAS:比较和替换,基于乐观锁锁的操作
watch指令,在事务提交时,若key值已经被改变,整个事务队列不会被执行。
通过watch命令在事务执行之前监控多个keys,若在watch之后有任何key发生变化,exec命令执行事务都会被放弃,同时返回nullmuliti-bulk应答事务执行失败。
- 事务创立过程
1.监控:以watch keys 监控事务上锁,keys为即将执行的操作的数据
2.开启:以milti开始一个事务
3.入队:将多个命令入队事务中,接到命令后不会立即执行,而是放入等待执行的事务队列中。
4.执行:由exec命令触发事务
- 特性:
不保证原子性,支持部分事务。
6.redis消息订阅
- 是什么
进程间的一种通信模式:发送者(pub)发送消息,订阅者(sub)接受消息.
7.redis的复制机制(master/stave)
- 是什么
即是主从复制,主机更新后根据配置和策略,自动同步到备份的master/slaver机制,master以写为主,slave以读为主。
- 作用
主从复制,容灾恢复
- 怎么做
1.配置从库不配置主库
2.从库配置:slaveof 主库IP 主库端口
3.每次与master断开之后,都需要重新连接,除非配置redis.conf
4.修改配置文件
拷贝多个配置文件redis.conf
info replication:查看配置
slaveof no one:当前数据库停止与其他数据库的同步,转成主数据库
- 用法
一主二仆:
1.主机可写,从机不可写,只读(读写分离)。
2.主机挂掉,从机待命
3.主机恢复,从机照旧
4.从机挂掉,需要重连主机
薪火相传:
主机接从机,从机后继续连接从机
反客为主:
主机挂掉,使用命令slaveof no one,变从机为主机(从机后接有从机)
- 复制原理
1.slave启动成功连接到master后,会发送一个sync命令。
2.master接到命令后启动后台的存盘进程,同时手机所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以便完成一次完全同步。
3.全量复制:当slave服务在接受到数据库文件数据后,将其存盘并加载到内存中。
4.增量复制:master继续将新的所有手机到的修改命令依次传给slave,完成同步。
5.但只要重新连接master,一次完全同步(全量复制)将自动执行。
- 哨兵模式(反客为主的自动版)
- 是什么
在后台监控主机是否故障,如果故障了根据投票数自动将从库转换成主库。
- 操作步骤:
1.调整结构为一主二仆
2.自定义的/myredis目录下新建文件:sentinel.conf,名字不能错
3.配置哨兵,在sentinel.conf文件中添加:
①:sentinel moniter 被监控主机名(自定义) 主机IP 端口号 1
②:数字1表示当主机挂掉后,salve投票,看谁的票数多,谁接替主机。
4.启动哨兵:redis-sentinel /usr/local/myredis/sentinel.conf(全路径地址)
5.当主机A挂掉,从机中选出从机B为主机B,当原主机A再次启动后,哨兵将其加为主机B的从机。
6.一组sentinel能同时监控多个master
- 复制缺点
1.复制延迟:由于所有的写操作都在master上,然后同步到slave,所以从master同步到slave机器有一定延迟,当系统很繁忙的时候,延迟更严重。