Redis超详细笔记
引言:
本文主要分享了Redis的相关知识,包括:Redis的安装、Redis Desktop Manager的安装使用、Redis的存储数据的结构分析、常用的命令(String、list、hash、set、zset、库操作以及key中高频使用的)、Redis的事务问题、Redis持久化机制以及Redis的淘汰机制;
@[toc]
1. Redis简介
由于用户量增大因此请求数量也增大,数据压力也就大了;多态服务器之间数据不同步;多态服务器之间的锁已经不存在互斥;因此引入了Redis。
Redis(Remote Dictionary Server)就是一款基于Key-Value的NoSQL非关系数据库;远程字典服务,由C语言编写完成,基于内存存储数据,提供了多种持久化机制,高性能并且提供了集群的搭建方式,可以方便的横向扩展以及纵向的垂直扩展,还支持事务的操作,保证了高并发场景下数据的安全性和一致性;
1.1 Redis特点
- 简单:部署较为简单
- 访问性能优越:读数据11万次/s,写数据8万次/s;
- 数据类型丰富:string、list、set、hash、zset、地理信息……
- 可以持久化存储:断电或者重启数据不会丢失;
1.2 应用场景
- 解决Session共享问题
- 解决高频数据库查询问题
- 高访问数据解决(将高访问的数据存到Redis中使用时直接从内存中取出,提高了速度和服务器开销)
- ……
2. Redis安装
2.1 下载Redis
下载地址:https://github.com/tporadowski/redis/releases
- 下载好减压即可
2.2 启动Redis
服务启动:在根目录下cmd中启动
redis-server.exe redis.windows.conf
客户端启动:在根目录下cmd
redis-cli.exe
2.3 使用Redis Desktop Manager连接Redis
下载地址:https://redisdesktop.com/pricing
- 傻瓜式安装
2.3.1 新建链接
2.3.2 测试是否成功
2.3.3 打开控制台
3. Redis存储数据的结构
Redis有5种常见的结构:string、hash、list、set、zset
不常用:
- HyperLogLog:计算近似值
- GEO:地理存储
- BIT:存储的是一个byte[]
3.1 key-string
一般用于存储一个值,一个key对应一个值;
key | value |
---|---|
name | kak |
- 一个key(name)对应一个值(kak)
3.2 key-hash
存储一个对象数据,一个key对应一个Map;
stu | name | kak |
---|---|---|
age | 20 | |
gender | man |
- 存储对象,一个stu对应了三个属性,一个Map集合;
3.3 key-list
使用list结构实现栈和队列结构,一个key对应一个列表;
key:value1,value2,value2,value3……
- 一个key存储多个有序的对象
3.4 key-set
交集、差集、并集的操作,一个key对应一个集合;
key:value4,value2,value1,value3……
- 一个key存储多个无序的对象
3.5 key-zset
排行榜、积分存储等等,一个key对应一个有序集合;
key:score1-value1,score2-value2,score3-value3……
- 放进去数据后会自动进行排序
4. Redis中常用命令
官方参考文档:http://doc.redisfans.com/
4.1 String常用命令
key-value value 为一个字符串,最大512M(弱类型)
- 类型隐式转换
#添加值
set person 30
#获取值
get person
#自增++
incr person
#自减--
decr person
#自增2个单位
incrby person 2
decrby person -2
#自减2个单位
incrby person -2
decrby person 2
#同时设置一个或多个key-value对
mset stu1 kak stu2 taotao stu3 zhuanghzuang
#同时获取一个或多个key-value对
mget stu1 stu2 stu3
#当key不存在时设置值,key存在时什么也不做
setnx stu1 kak
#设置值得同时,指定生存时间
setex stu1 20 kak
#在stu1对应的kaka追加内容,返回长度
append stu1 kaka
#查看value的字符串长度
strlen stu1
4.2 hash常用命令
大小:2^32-1
#存储数据
hset stu:1 sage 23
#获取数据
hget stu:1 sid
#批量创建数据
hmset stu:2 sid 1002 sname kak sage 23
#批量获取数据
hmget stu:2 sid sname sage
#获取所有的hash的key值
hkeys stu:1
#获取所有的hash的value值
hvals stu:1
#获取所有的数据
hgetall stu:1
#获取当前hash结构中的值的数量
hlen stu:1
#删除key对应的值,返回值移除的数量
hdel stu:1 sid
#检查值是否存在,存在返回1,不存在返回0
hexists stu:1 sname
#设置值(不存在正常添加,存在不添加)
hsetnx stu:3 sid 1003
4.3 set常用命令
大小:2^32-1
#存储数据,返回长度
sadd slist zhangsan lisi wangwu zhaoliu tianqi
#获取全部数据
smembers slist
#随机获取数据,获取的同时删除
spop slist
#随机取得3个元素,不删除
srandmember slist 3
#交集(取多个set集合交集)
sinter slist slist2
#并集(取全部集合中的数据)
sunion slist slist2
#差集(取多个集合中不一样的数据)
sdiff slist slist2
#删除数据,返回删除的数量
srem slist tianqi
#查看set集合中是否包含kak这个值,包含1、不包含0
sismember slist kak
#保存交集的结果
sinterstore slist slist2
#差集保存到集合
sdiff slist slist2
4.4 zset常用命令
有序集合
- 默认从小到大排序
#添加数据(87是score必须为数字,kak为member不可以重复)
zadd english 87 kak
#修改member的分数---加2分,存在加,不存在相当于zadd
zincrby english 2 kak
#查看指定的member的分数
zscore english kak
#查看范围(取下标)
zrange english 0 -1
#查看反序的范围(从大到小,取下标)
zrevrange english 0 -1
#查看30~60分的人数
zcount english 30 60
#查看名次,返回名次
zrank english kak
#查看zset中的数据数量
zcard english
#删除zset的成员
zrem engilsh taotao
4.5 库中常用的命令
#清空当前所在的数据库
flushdb
#清空全部的数据库
flushall
#查看数据库有多少key
dbsize
#查看最后一次的操作时间
lastsave
#实时监控Redis服务接收的命令
monitor
4.6 其他常用命令
#选择操作的0库
select 0
#移动stu到另外一个库(1库)
move stu 1
#移除key的剩余生存时间:1移除成功、0不存在生存时间或者key不存在
persist key
#查看key值得数量
keys *
#删除
del person
#查看剩余生存时间:key不存在时返回-2、key存在但没有设置剩余生存时间时返回-1、设置生存时间返回key的剩余生存时间(秒)
ttl person
#设定生存时间,给person设定生存时间为10秒
expire person 10
#检查给定key是否存在:存在返回1,否则返回0
exists person
5. Redis事务
5.1 事务指令
multi :开启事务
exec: 执行事务
discard:放弃事务
watch:检查
unwatch:撤销检查
5.2 redis的事务特性
redis的事务是分布式事务也就是跨链接的事务;
5.2.1 单链接提交事务
- multi 开启事务后,将写入的数据存放在队列中不执行,提交的时候才按顺序执行;
- exec提交事务时,一次性执行;
5.2.2 单链接撤销事务
- multi 开启事务后,将写入的数据存放在队列中不执行,提交的时候才按顺序执行;
- discard 撤销事务,不执行;
5.2.2 分布式事务
两个会话,跨连接
- 会话1:开启事务multi ,进行数据的操作,不提交;
- 会话2:查看,还是未改变的;
- 会话1:exec 提交事务
- 会话2:查看,已经改变
- 会话2:改变数据
- 会话1:提交,数据结果为会话2改变后的;
- 场景:如果同时操作,需要watch监控
- watch key
- 会话1 :开启事务,进行相关操作
- 会话2:干扰
- 提交,结果为会话2的结果;
- watch监控发生作用,两个共同操作一个key的话,先提交事务的一方修改,另一方将放弃所有操作;(秒抢)
6. Redis持久化机制
在redis.windows.conf中修改参数:appendonly
- no:RDB快照模式
- yes:AOF模式
6.1 RDB
RDB为快照模式,是Redis的默认持久化机制;
- RDB持久化文件速度比较快 ,存储的是一个二进制文件,传输方便;
- redis.windows.conf中关于RDB的描述:
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
- 大意就是,在15分钟内有一次改变就会触发改变;5分钟有10次改变也会触发改变;在1分钟改变了10000次同样会触发改变;
- RDB无法保证数据的绝对安全;
6.2 AOF
AOF持久化机制默认是关闭的:
AOF持久化速度相对RDB较慢,存储的是一个文本文件,文件会越来越大,传输困难;
The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
- 就是说,传输是最安全的,但是牺牲性能,权衡使用;
- 官方推介同时开启RDB和AOF持久化,更安全可以避免数据丢失;
AOF持久化机制:
- appendfsync always:每执行一个写操作,立刻持久化到文件中,性能较低;
- appendfsync everysec:每秒执行一次持久化;
- appendfsync no:根据操作系统、环境的不同,在一定时间执行一次持久化;
7. Redis的淘汰机制
7.1 过期策略
redis有两种过期策略,定期删除和惰性删除
- 定期删除:redis每个100ms随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除;
- 惰性删除:在获取某个key的时候,redis检查一下,如果该key设置了过期时间则判断该过期时间是否已经过期,如果过期了就直接删掉并不返回任何东西;
7.1 内存淘汰机制
当Redis内存已经满的时候,再次添加一个新数据会执行淘汰机制,在redis.windows.conf中maxmemory-policy设置改变参数:
redis提供6中数据淘汰策略:
- volatile-lru:Redis会在设置过生存期的key中删除一个最近最少(时钟最短、频率最少)使用的key;
- allkey-lru:Redis会在全部的key中干掉一个最近最少的使用的key;
- volatile-random:Redis会在设置过生存期的key中随机干掉一个;
- allkey-random:Redis会在全部的key中随机干掉一个;
- volatile-ttl:从已设置了过期时间的key中挑选即将要过期的key干掉一个;
- noeviction:默认,内存不足时会报错;
附 数据库分类
关系型数据库:
- Oracle 、mysql、sqlserver、db2、达梦、神通
NoSql数据库
- 缓存数据库: redis、memcached
- 文档数据库:MongoDB、ES、Solr
- 面向列数据库:hbase
- 图形数据库:Nero4j
- 网络数据库