Redis 的简单学习与整理
背景
最近一直进行Redis性能调优和高可用的课题
但是不管什么课题,第一步应该是学习与使用redis
之前总结过 rdb 与 rdr 分析 键值对等内容.
但是发现想要深入进行分析时 掌握的知识是非常不足的
今天计划进行一下简单学习.
Redis服务与客户端
Redis是世界上最流行的键值对数据库.
他的编译和使用也非常简单(开源版, 企业版我没搞定,比较麻烦)
一般实际上只需要3个文件就足够了
redis-cli 是客户端工具
redis-server 是服务器端工具
redis.conf 是配置工具
Redis配置文件简介
redis.conf 是redis的核心配置文件
主要需要注意的配置项目是:
bind 127.0.0.1 或者 0.0.0.0
# 注意 127.0.0.1 仅允许本机访问. 0.0.0.0 可以外部访问
requirepass password
# 设置访问密码
save aof dump 等参数
# 设置持久化
protected-mode
# 建议关闭保护模式.
connection
# 默认10000个连接,可以改大, 但是不建议太多.
# redis 7 以后可以有 io多线程参数.
daemonize yes
#后台作为驻留服务运行.
服务启动与关闭
redis-server /path/to/redis.conf
#启动服务就可以了.
lsof -i:6379
#查询进程相关的信息
#注意监听如果是 localhost 的话 外部无法访问.
kill -9 xxxx
#或者是执行shutdown 关闭服务也可以.
登录Redis服务器
redis-cli
#就可以默认登录 本机 6379 端口的服务
redis-cli -a Yourpassword -p Yourport
#可以明文指定密码 -p 可以单独指定端口号.
redis-cli -c
#集群模式登录的命令.
#可以选择任意一个集群的端口进行登录与访问.
进入机器后可以查询服务器的状态
info
# 可以查看redis服务器的信息.
info keyspace ; info memory; info clients
# 可以查看不同的服务器信息.
dbsize
#也可以查看当前数据库的键值对数量.
Redis的键值对类型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
Ridis关于key的命令简介
keys *查看当前库所有key (匹配:keys *1)
# 注意这个命令不能常用,会导致严重的性能问题, 会hang住系统.
exists key判断某个key是否存在
type key 查看你的key是什么类型
del key 删除指定的key数据
unlink key 根据value选择非阻塞删除
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 10 10秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
select命令切换数据库
dbsize查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库
Redis String类型key说明
set key value
#设置键值对
*NX:当数据库中key不存在时,可以将key-value添加数据库
*XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
*EX:key的超时秒数
*PX:key的超时毫秒数,与EX互斥
get key
# 获取键对应的键值.
append key value
# 添加指定的值到末尾
setnx key value
# 只有键值对不存在时才会设置具体的值.
Redis List类型的说明
lpush/rpush key value1 value2 value3 ....
#从左边/右边插入一个或多个值。
lpop/rpop key
#从左边/右边吐出一个值。值在键在,值光键亡。
rpoplpush key1 key2
#从 key1 列表右边吐出一个值,插到 key2 列表左边。
lrange key start stop
#按照索引下标获得元素(从左到右)
len key
#获得列表长度
linsert key before value newvalue
#在 value 的后面插入 newvalue 插入值
lrem key n value
#从左边删除n个value(从左到右)
lset key index value
#将列表key下标为index的值替换成value
Redis Set类型的说明
Redis set对外提供的功能与list类似是一个列表的功能,
特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,
又不希望出现重复数据时,set是一个很好的选择,
并且set提供了判断某个成员是否在一个set集合内的重要接口,
这个也是list所不能提供的。
Redis的Set是string类型的无序集合。
它底层其实是一个value为null的hash表,
所以添加,删除,查找的复杂度都是O(1)。
Redis Set类型的说明
sadd key value1 value2
# 添加 value1 value2 key中. 如果已经存在会就行插入,并且排重.
smembers key
# 取出该集合的所有值.
sismember key value
# 检查key 是否存在于set中.
scard key
# 检查key值的数量
srem key value
# 删除key中value的项目
spop key
# 随机吐出一个项目
sinter / sunion / sdiff
# 交集 并集 差集
Redis Hash类型的说明
Redis hash是一个string类型的field和value的映射表,
hash特别适合用于存储对象。
hgetall key
# 获取hash 所有的field 和value的映射表信息.
hset key field value
#给 key 集合中的 field 键赋值 value
hget key1 field
#从 key1 集合 field 取出 value
hmset key1 field1 value1 field2 value2 ...
#批量设置hash的值
hexists key1 field
#查看哈希表 key 中,给定域 field 是否存在。
hkeys key
# 出该hash集合的所有field
hvals key
# 列出该hash集合的所有value
hincrby key field increment
#为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx key field value
#将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
Redis Zset类型的说明
Redis有序集合zset与普通集合set非常相似,
是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了
一个评分(score),这个评分(score)
被用来按照从最低分到最高分的方式排序集合中的成员。
集合的成员是唯一的,但是评分可以是重复了 。
Redis Zset类型的说明
zadd key score1 value1 score2 value2 …
# 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zrange key start stop [WITHSCORES]
#返回有序集 key 中,下标在 start stop 之间的元素
#带WITHSCORES,可以让分数一起和值返回到结果集。
zrangebyscore key minmax [withscores] [limit offset count]
#返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
#有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count]
#同上,改为从大到小排列。
zincrby key increment value
#为元素的score加上增量
zrem key value
#删除该集合下,指定值的元素
zcount key min max
#统计该集合,分数区间内的元素个数
zrank key value
#返回该值在集合中的排名,从0开始。
Redis 持久化相关
RDB(Redis DataBase)
AOF(Append Of File)
RDB
Redis会单独创建(fork)一个子进程来进行持久化,
会先将数据写入到 一个临时文件中,待持久化过程都结束了,
再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的,
这就确保了极高的性能 如果需要进行大规模数据的恢复,
且对于数据恢复的完整性不是非常敏感,
那RDB方式要比AOF方式更加的高效。
RDB的缺点是最后一次持久化后的数据可能丢失。
save : save时只管保存,其它不管,全部阻塞。
手动保存。不建议。
bgsave:Redis会在后台异步进行快照操作,
快照同时还可以响应客户端请求。
save 900 1
表示 15分钟内有一次变化就落盘
RDB的优缺点
优点:
1. 适合大规模的数据恢复
2. 对数据完整性和一致性要求不高更适合使用
3. 节省磁盘空间
4. 恢复速度快
缺点:
1. Fork的时候,内存中的数据被克隆了一份,
大致2倍的膨胀性需要考虑
2. 虽然Redis在fork时使用了写时拷贝技术,
但是如果数据庞大时还是比较消耗性能。
3. 在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,
就会丢失最后一次快照后的所有修改。
AOF
以日志的形式来记录每个写操作(增量保存),
将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,
redis启动之初会读取该文件重新构建数据,
换言之,redis 重启的话就根据日志文件的内容将
写指令从前到后执行一次以完成数据的恢复工作
启动方式: 修改默认的appendonly no,改为yes
appendfsync always|everysec|no
优缺点
优点:
1. 备份机制更稳健,丢失数据概率更低。
2. 可读的日志文本,通过操作AOF稳健,可以处理误操作。
缺点:
1. 比起RDB占用更多的磁盘空间。
2. 恢复备份速度要慢。
3. 每次读写都同步的话,有一定的性能压力。
4. 存在个别Bug,造成恢复不成功.