Redis
【redis是什么】
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)
目前,Vmware在资助着redis项目的开发和维护。
【redis数据结构 – 简介】
redis是一种高级的key:value存储系统,其中value支持五种数据类型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)
1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key也不要太短,太短的话,key的可读性会降低;
3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6abWulaX-1672207651175)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20221115003824730.png)]
先更新数据库再删除缓存
【redis数据结构 – strings】
有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。
我们来看一个最简单的例子:
字符串类型是Redis最基础的数据结构,其它的几种数据结构都是在字符串类型基础上构建的,字符串的值可以是:字符串、数字、二进制,但其值最大不能超过512M。
使用场景: 缓存、计数器、对象存储缓存(共享session)、限速
常用命令:
set key value: 设置一个key的value值
setnx key value: 仅当key不存在时进行set
setex key seconds value: set 键值对并设置过期时间
mset key value [key value …]: 设置多个key value
msetnx key1 value1 [key2 value2…]: 批量设置键值对,仅当参数中所有的key都不存在时执行,原子性操作,一起成功,一起失败
get key: 返回key的value
mget key [key …] : 批量获取多个key保存的值
exists key [key …]: 查询一个key是否存在
decr/incr key: 将指定key的value数值进行+1/-1(仅对于数字)
incrby/decrbyB key n: 按指定的步长对数值进行加减
incrbyfloat key n: 为数值加上浮点型数值
append key value: 向指定的key的value后追加字符串
strlen key: 返回key的string类型value的长度。
getset key value: 设置一个key的value,并获取设置前的值,如果不存在则返回null
setrange key offset value: 设置指定位置的字符
getrange key start end: 获取存储在key上的值的一个子字符串
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703
set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型
字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。
另外,我们还可以通过字符串类型进行数值操作:
127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"
看,在遇到数值操作时,redis会将字符串类型转换成数值。
由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
【redis数据结构 – lists】
redis的另一个重要的数据结构叫做lists,翻译成中文叫做“列表”。
首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。
虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。
lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。我们来看几个例子:
lpush : 左插
rpush:右插
lrange:取值范围
lrange mylist 0 -1:列出mylist中从编号0到倒数第一个元素
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也可以获取指定范围指定下标的元素等。一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
两个特点:
1.列表中的元素是有序的,可以通过索引下标获取某个元素霍某个某个范围内的元素列表
2.列表中的元素可以是重复的
使用场景: 消息队列、栈、文章列表等。
常用指令:
添加操作
lpush/rpush key value1[value2…]: 从左边/右边向列表中PUSH值(一个或者多个)
lpushx/rpushx key value: 向已存在的列名中push值(一个或者多个),list不存在 lpushx失败
linsert key before|after pivot value: 在指定列表元素的前/后 插入value
查找操作
lindex key index: 通过索引获取列表元素
lrange key start end: 获取list 起止元素 (索引从左往右 递增)
llen key: 查看列表长度
删除操作
lpop/rpop key: 从最左边/最右边移除值 并返回
lrem key count value: count >0:从头部开始搜索 然后删除指定的value 至多删除count个 count < 0:从尾部开始搜索… count = 0:删除列表中所有的指定value。
ltrim key start end: 通过下标截取指定范围内的列表
rpoplpush source destination: 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部
修改操作
lset key index value: 通过索引为元素设值
阻塞操作
blpop/brpop key1[key2] timout: 移出并获取列表的第一个/最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpoplpush source destination timeout: 和rpoplpush功能相同,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703
//新建一个list叫做mylist,并在列表头部插入元素"1"
127.0.0.1:6379> lpush mylist "1"
//返回当前mylist中的元素个数
(integer) 1
//在mylist右侧插入元素"2"
127.0.0.1:6379> rpush mylist "2"
(integer) 2
//在mylist左侧插入元素"0"
127.0.0.1:6379> lpush mylist "0"
(integer) 3
//列出mylist中从编号0到编号1的元素
127.0.0.1:6379> lrange mylist 0 1
1) "0"
2) "1"
//列出mylist中从编号0到倒数第一个元素
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "1"
3) "2"
lists的应用相当广泛,随便举几个例子:
1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.利用LRANGE还可以很方便的实现分页的功能。
3.在博客系统中,每片博文的评论也可以存入一个单独的list中。
【redis数据结构 – 集合sets】
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子:
sadd:新增元素
smembers:列出所有元素
sismember:判断是否是集合成员
sunion:合并集合
Redis的Set是string类型的无序集合,我们不能通过索引获取元素。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
应用场景: 标签(tag)
常用命令:
集合内操作
sadd key member1[member2…]: 向集合中无序增加一个/多个成员
srem key member1[member2…]: 移除集合中一个/多个成员
scard key: 获取集合的成员数
smembers key: 返回集合中所有的成员
sismember key member: 查询member元素是否是集合的成员,若存在返回1,不存在返回0
srandmember key [count]: 随机返回集合中count个成员,count缺省值为1
spop key [count]: 随机移除并返回集合中count个成员,count缺省值为1
集合间操作
sinter key1 [key2…]: 返回所有集合的交集
sinterstore destination key1[key2…]: 在SINTER的基础上,存储结果到集合中。覆盖
sunion key1 [key2…]: 返回所有集合的并集
sunionstore destination key1 [key2…]: 在SUNION的基础上,存储结果到及和张。覆盖
sdiff key1[key2…]: 返回所有集合的差集 key1- key2 - …
sdiffstore destination key1[key2…]: 在SDIFF的基础上,将结果保存到集合中。覆盖
smove source destination member: 将source集合的成员member移动到destination集合
sscan key [MATCH pattern] [COUNT count]: 在大量数据环境下,使用此命令遍历集合中元素,每次遍历部分
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703
//向集合myset中加入一个新元素"one"
127.0.0.1:6379> sadd myset "one"
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
//列出集合myset中的所有元素
127.0.0.1:6379> smembers myset
1) "one"
2) "two"
//判断元素1是否在集合myset中,返回1表示存在
127.0.0.1:6379> sismember myset "one"
(integer) 1
//判断元素3是否在集合myset中,返回0表示不存在
127.0.0.1:6379> sismember myset "three"
(integer) 0
//新建一个新的集合yourset
127.0.0.1:6379> sadd yourset "1"
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
//对两个集合求并集
127.0.0.1:6379> sunion myset yourset
1) "1"
2) "one"
3) "2"
4) "two"
对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
【redis数据结构 – 有序集合sorted sets(zset)】
redis不但提供了无需集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。
很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等
老规矩,我们来看几个生动的例子:
zadd:添加有序集合 zadd 集合名 序号 成员
zrange:列出有序集合范围 0 -1 [with scores]
在有序集合中保留了不能有重复成员的特性,但其中的成员是可以排序的,每一个元素都会关联一个double类型的分数(score)作为排序依据,score相同时按字典顺序排序。redis正是通过分数来为集合中的成员进行从小到大的排序。
应用场景: 排行榜系统,成绩单,工资表
常用命令:
集合内
zadd key score member1 [score2 member2]: 向有序集合添加一个或多个成员,或者更新已存在成员的分数
zcard key: 获取有序集合的成员数
zscore key member: 返回有序集中,成员的分数值
zcount key min max: 计算在有序集合中指定区间score的成员数
zlexcount key min max: 在有序集合中计算指定字典区间内成员数量
zincrby key n member: 有序集合中对指定成员的分数加上增量 n
zscan key cursor [MATCH pattern] [COUNT count]: 迭代有序集合中的元素(包括元素成员和元素分值)
范围查询
zrank key member: 返回有序集合中指定成员的索引
zrevrank key member: 返回有序集合中指定成员的索引,从大到小排序
zrange key start end: 通过索引区间返回有序集合成指定区间内的成员
zrevrange key start end: 通过索引区间返回有序集合成指定区间内的成员,分数从高到底
zrangebylex key min max: 通过字典区间返回有序集合的成员
zrevrangebylex key max min: 按字典顺序倒序返回有序集合的成员
zrangebyscore key min max: 返回有序集中指定分数区间内的成员 -inf 和 +inf分别表示最小最大值,只支持开区间
zrevrangebyscore key max min: 返回有序集中指定分数区间内的成员,分数从高到低排序
删除操作
zrem key member1 [member2…]: 移除有序集合中一个/多个成员
zremrangebylex key min max: 移除有序集合中给定的字典区间的所有成员
zremrangebyrank key start stop: 移除有序集合中给定的排名区间的所有成员
zremrangebyscore key min max: 移除有序集合中给定的分数区间的所有成员
集合间操作
zinterstore destination numkeyskey1 [key2 …]: 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score
zunionstore destination numkeys key1 [key2…]: 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1:
127.0.0.1:6379> zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
127.0.0.1:6379> zadd myzset 3 360.com
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
127.0.0.1:6379> zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0.0.1:6379> zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
127.0.0.1:6379> zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
【redis数据结构 – 哈希hash】
最后要给大家介绍的是hashes,即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
我们来看一个例子:
HMSET : 新增
HGETALL: 列出某哈希的所有成员
HSET:修改成员值
几乎所有的编程语言都提供了哈希(hash)结构,Redis中 hash 是一个string类型的field和value的映射表value={{field1,value1},{field2,value2}…},可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。
应用场景: 用户信息缓存
常用命令:
hset key field value: 将哈希表 key 中的字段 field 的值设为 value。重复设置同一个field会覆盖,返回0
hmset key field1 value1 [field2 value2…]: 同时将多个 field-value (域-值)对设置到哈希表 key 中。
hsetnx key field value: 只有在字段 field不存在时,设置哈希表字段的值。
hget key field value: 获取存储在哈希表中指定字段的值
hmget key field1 [field2…]: 获取所有给定字段的值
hexists key field: 查看哈希表 key 中,指定的字段是否存在。
hdel key field1 [field2…]: 删除哈希表key中一个/多个field字段
hlen key: 获取哈希表中字段的数量
hkeys key: 获取所有字段field
hvals key: 获取哈希表中所有值value
hgetall key: 获取在哈希表key 的所有字段和值
hincrby key field n: 为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段
hincrbyfloat key field n: 为哈希表 key 中的指定字段的浮点数值加上增量 n。
hscan key cursor [MATCH pattern] [COUNT count]: 迭代哈希表中的键值对。
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703
//建立哈希,并赋值
127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
//更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "12345"
5) "age"
6) "34"
有关hashes的操作,同样很丰富,需要时,大家可以从这里查询。
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
优点:
只有一个文件 dump.rdb,方便持久化。
容灾性好,一个文件可以保存到安全的磁盘。
性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单 独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
相对于数据集大时,比 AOF 的启动效率更高。
缺点:
数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数 据丢失。所以这种方式更适合数据要求不严谨的时候)
AOF(Append-only fifile)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式 完全持久化存储)保存为 aof 文件。
AOF:持久化:
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件
中,当重启Redis会重新将持久化的日志中文件恢复数据。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复
优点:
数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录 到 aof 文件中一次。
通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一 致性问题。
AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flflushall))
缺点:
AOF 文件比 RDB 文件大,且恢复速度慢。
数据集大的时候,比 rdb 启动效率低。
俩种持久化的优缺点是什么?
AOF文件比RDB更新频率高,优先使用AOF还原数据。
AOF比RDB更安全也更大
RDB性能比AOF好
如果两个都配了优先加载AOF
————————————————
版权声明:本文为CSDN博主「柚子茶1990」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a6636656/article/details/124429803
Redis 如何设置密码及验证密码?
- 设置密码: confifig set requirepass 123456 授权密码: auth 123456
1、key名设计
可读性和可管理性
以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id
控制key的生命周期
redis不是垃圾桶,建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注idletime。
服务器相关命令
ping : 检测连接是否存活
echo: 在命令行打印一些内容
quit、exit: 退出客户端
shutdown: 退出服务器端
info: 返回redis相关信息
config get dir/* 实时传递接收的请求
showlog: 显示慢查询
select n: 切换到数据库n,redis默认有16个数据库(DB 0~DB 15),默认使用的第0个
dbsize: 查看当前数据库大小
move key n: 不同数据库之间数据是不能互通的,move移动键到指定数据库
flushdb: 清空当前数据库中的键值对。
flushall: 清空所有数据库的键值对。
key相关命令
在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。
常用命令:
keys * :查看当前数据库中所有的key
dbsize: 键总数
exists key: 检查键是否存在
del key [key …]: 删除键
expire key seconds: 键过期
ttl key: 获取键的有效时长
persist key: 移除键的过期时间
type key: 键的数据结构类型
randomkey: 随机返回数据库中一个键
rename key1 key2 : 重命名
renamex key1 key2 : 当key2不存在时,key1重命名
————————————————
版权声明:本文为CSDN博主「龙源lll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lzy410992/article/details/116094703