Redis入门
Redis
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,
- redis支持数据的持久化,可以将内存中的数据存储到磁盘中。
- 不仅仅支持key-value类型的数据,还支持list,set,zset,hash等数据结构
- 支持数据的备份
redis的特点
- 极高的性能,读取速度可达110000次/s;写的速度高达81000次/s
- 支持多种数据类型
- 所有操作都是原子性的(包括多步操作)
- Redis 支持持久化 内存数据库 持久化到硬盘中
- Redis单进程,单线程 效率高 Redis实现分布式锁
redis的数据类型和相关命令
- string 字符串
一个键最大可以存512mb
//存入
set mykey "hello word"
//取出
get mykey
//返回key中的字符串的子字符串
getrange key start end
// 将key的值设为value并返回旧值
getset key value
//对key所存储的字符串,获取指定偏移量上的位
getbit key offset
//获取所有给定key的值
mget key1 [key2...]
//对所有key存储的字符串,设置或清除指定偏移量上的位
setbit key offset value
//将值value关联到key,并将key的过期时间设为seconds
setex key seconds value
//只有在key不存在时设置key的值
setnx key value
//返回key所存储的字符串的长度
srtlen key
//将key中存储的值加一
incr key
//将key所存储的值加上给定的增量值
incrbyfloat key increment
//在key后面追加字符串
append key value
- hash 哈希
适合存储对象
// 存入
hmset myhash mykey01 "hello"
//取出
hget myhash mykey01
// 获取存储在哈希表中指定key的所有字段和值
hgetall key
//为哈希表key中的指定字段的整数值加上增量increment
hincrby key field incremtn
//获取所有哈希表中的字段
hkeys key
//获取哈希表中字段的数量
hlen key
// 将哈希表key中的字段field的值设为value
heset key field value
//只有在字符按field不存在时,设置哈希表字段的值
hsetnx key field value
// 获取哈希表中所有的值
hvals ksy
-
list 列表
列表是字符串列表,按照存入顺序排序//从头部插入 lpush mylist hello //从尾部追加 rpush mylist word //列出 lange mylist 0 10 //移除并获取第一个元素 ,如果没有元素会阻塞列表直到等待超时会发现可弹出的元素为止 blpop key1 [key] timeout //移除并获取列表的最后一个元素。如果没有元素则会阻塞列表,直到等待时间超时,或发现可弹出的元素为止。 brpop key1 [key2] timeout //从列表中弹出一值,并将弹出的元素插入到另一个列表中并返回它;如果没有元素则会阻塞直到超时,或发现可以弹出的元素 brpoplpush source destination timeout //通过元素的索引获取列表中的元素 lindex key index //获取列表的长度 llen key //移除列表的第一个原元素 lpop key //将一个值插入到已存在的列表的头部 lpushx key value //获取列表指定范围内的元素 lrange key start stop //移除列表元素 lrem key count //通过索引设置列表元素的值 lset key index value //让列表只保留指定区间的元素 Ltrim key start stop //移除列表的最后一个元素 rpop key //移除列表的最后一个元素,并将该元素添加到另一个列表并防护 rpoplpush source destination //为列表章添加多个值 rpush key value1 [value2] //为已存在的列表添加值 rpushhx key value
-
set 集合
是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)//加入 sadd myset aaa sadd myset bbb //列出 smembers myset //获取结合的成员数 scard key //返回指定结合的差集 sdiff key1 [key2] //返回给定集合的差集并存储在destination中 sinterstore destionation key1 [key2] //判断memeber元素是否是集合key的成员 sismember key member //将member从source结合移动到destination集合 smove source destionation member //移除并返回集合中的一个随机元素 spop key //返回集合中的一个或多个随机数 srandmember key [count] //返回给定集合的并集 sunion key1 [key2]
-
zset 有序集合
不允许重复的成员,每个成员都关联一个double类型的分数。按分数,从小到大排序//加入 zadd mysset 0 aaa zadd mysset 1 bbb //列出 zrangebysocre mysset 0 10 //向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZADD key score1 member1 [score2 member2] //获取有序集合的成员数 ZCARD key //计算在有序集合中指定区间分数的成员数 ZCOUNT key min max //有序集合中对指定成员的分数加上增量 increment ZINCRBY key increment member //计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 ZINTERSTORE destination numkeys key [key ...] //在有序集合中计算指定字典区间内成员数量 ZLEXCOUNT key min max //通过索引区间返回有序集合成指定区间内的成员 ZRANGE key start stop [WITHSCORES] //通过字典区间返回有序集合的成员 ZRANGEBYLEX key min max [LIMIT offset count] //通过分数返回有序集合指定区间内的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] //返回有序集合中指定成员的索引 ZRANK key member //移除有序集合中的一个或多个成员 ZREM key member [member ...] //移除有序集合中给定的字典区间的所有成员 ZREMRANGEBYLEX key min max //移除有序集合中给定的排名区间的所有成员 ZREMRANGEBYRANK key start stop //移除有序集合中给定的分数区间的所有成员 ZREMRANGEBYSCORE key min max //返回有序集中指定区间内的成员,通过索引,分数从高到底 ZREVRANGE key start stop [WITHSCORES] //返回有序集中指定分数区间内的成员,分数从高到低排序 ZREVRANGEBYSCORE key max min [WITHSCORES] //返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 ZREVRANK key member //返回有序集中,成员的分数值 ZSCORE key member //计算给定的一个或多个有序集的并集,并存储在新的 key 中 ZUNIONSTORE destination numkeys key [key ...] //迭代有序集合中的元素(包括元素成员和元素分值) ZSCAN key cursor [MATCH pattern] [COUNT count]
redis键的管理
-
删除key
del key
-
序列化指定的key,并返回被序列化的值
dump key
-
检查给定的ksy是否存在
exists key
-
给指定的key设置过期时间(秒)
expire key seconds
-
给指定的key设置过期时间戳
expireat key timestamp
-
查找符合给定模式的key
keys pattern
-
移动key到指定的数据库
move key db
-
persist key
移除key的过期时间
-
以毫秒为单位返回key的剩余的过期时间
pttl key
-
以秒为单位返回key的剩余的过期时间
ttl key
-
修改key的名称
rename key newkey
-
只当newkey不存在的时候改名
renamenx key newkey
-
返回key所存储的值的类型
type key
Redis HyperLogLog
用来做基数统计。其优点在于当数据数据的量或体积很大的时候,计算基数的空间是固定的,并且是很小的。
//添加指定元素到 HyperLogLog 中。
PFADD key element [element ...]
//返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]
//将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
发布订阅
redis发布订阅是一种消息通信模式;发送者发送消息,接受者接收消息。redis客户端可以订阅任意数量的频道。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BCJlsjyO-1605168552037)(https://s2.ax1x.com/2019/04/17/Az13Xd.png)]
redis事务
一个事务从开始到执行会经历以下三个阶段
- 开始事务
- 命令入队
- 执行事务
以multi开始一个事务,以exec结束一个事务。
相关的事务命理
//取消事务
discard
//执行事务块内的命令
exec
//标记一个事务块的开始
multi
//取消watch命令对所有key的监视
unwatch
//监视指定的key,如果在执行事务之前这些key被其它命令改动则事务被打断
watch
redis连接
//验证密码是否正确
auth password
//打印字符串
echo message
//查看服务是否运行
ping
//关闭当前连接
quit
//切换到指定的数据库
select index
redis启动服务的细节
开启redis远程链接
持久化机制
client redis [内存]-----》内存数据–数据持久化—》磁盘
Redis官方提供了两种不同的持久化方法来将数据存储到硬盘里面分别是:
- 快照(Snapshort)
- AOF(Append Only File)只追加日志文件
快照
1.特点
这种方式可以将某一时刻的所有数据都写入硬盘中,当然也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。
2.快照生成方式
- 客户端方式:BGSAVE 和SAVE指令
- 服务器配置自动触发
1.客户端方式之BGSAVE
-a. 客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会调用fork来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求
·名词解释:fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类似unix系统中创建子进程的操作会进行优化:在刚开始分时候,父进程共享相同的内存· 直到父进程或子进程对内存进行了写之后,对写入的内存的共享才会结束服务
注意:SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务
AOF 只追加日志文件
springBoot操作Redis
Redis key设置超时时间应用
手机号验证
redis应用场景
1.利用redis 中字符串类型完成 项目中手机验证储存的实现
2.利用redis 中字符串类型完成 具有失效性业务功能 12306 淘宝 订单还有:40分钟
3.利用redis分布式集群系统中Session 共享memcache 内存 数据库存储上限 数据类型比较简单 redis 内存 数据类型丰富
4.利用redis zset类型 可排序set类型 元素 分数 排行榜功能 dangdang 销量排行 sales(Zset)[商品id,商品销量]
5.利用redis 分布式缓存 实现
6.利用redis 储存认证之后token信息 微信小程序 微信公众号 |用户 openid —》令牌(token)
7.利用redis 解决分布式集群系统中分布式锁问题 redis 单进程 单线程
jvm 1进程开启多个线程 synchronize int n=20
jvm 1进程开启多个线程 synchronize int n=20
…LRA脚本
分布式缓存的实现
redis分布式缓存(二)
redis分布式缓存(三)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkoEqiUn-1605168552079)(http://zhao.zcycomputer.cn/2020-09-05_111224.png)]
主从复制
Redis哨兵模式
Redis 集群
PING —>PONG 协议
原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPLPJETK-1605168552090)()]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Aq0ubEk-1605168552092)()]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuCF7X3F-1605168552096)()]
Redis实现session共享管理
代码地址 https://gitee.com/zhanchengyang/learning