Redis是什么?
Redis是一个开源的、高性能的、基于内存的、可选持久化的键值对存储数据库(非关系型数据库),支持多种数据类型和多种语言的API。Redis的全称是Remote Dictionary Server,意思是远程字典服务器。
Redis有什么用?
作为缓存:Redis可以作为缓存层来提高应用程序的响应速度和吞吐量,减轻后端数据库的压力,同时也可以利用Redis的过期机制和淘汰策略来管理缓存数据。
分布式锁:Redis可以利用字符串(string)这种数据结构以及一些原子操作来实现分布式锁功能,例如使用SETNX命令来设置一个带有过期时间的键作为锁,并且使用DEL命令来释放锁。
消息队列:Redis可以利用列表(list)或者流(stream)这种数据结构来实现消息队列功能,例如实现发布订阅模式(pub/sub)、任务队列(task queue)或者日志收集(log aggregation)等功能,并且可以保证消息的可靠性和顺序性。
Redis发展历史?
2009年,Redis的创始人Salvatore Sanfilippo开始开发Redis项目,最初是为了支持他自己的创业公司LLOOGG提供实时日志分析服务。
2010年,Redis从0.9版本跳到了1.2版本,增加了对哈希、列表、集合和有序集合等数据类型的支持,以及对事务和发布订阅等功能的支持。
2011年,Redis从1.2版本升级到了2.0版本,引入了RDB和AOF两种持久化机制,以及对虚拟内存和主从复制等特性的改进。
2013年,Redis从2.0版本升级到了2.6版本,增加了对Lua脚本、位图、HyperLogLog等数据结构和功能的支持。
2014年,Redis从2.6版本升级到了3.0版本,实现了对集群模式的支持,以及对GeoHash、Sorted Set等数据结构和功能的优化。
2016年,Redis从3.0版本升级到了4.0版本,增加了对模块化扩展、淘汰策略、PSYNC2等特性的支持。
2018年,Redis从4.0版本升级到了5.0版本,引入了流数据类型和消费者组等新特性,以及对模块系统、集群模式等方面的改进。
2020年,Redis从5.0版本升级到了6.0版本,增加了对多线程IO、ACL、TLS等特性的支持。
2021年,Redis从6.0版本升级到了7.0版本,实现了对函数库、多部分AOF、分片发布订阅等新特性的支持。
如果需要稳定性和兼容性,可以选择最新的稳定版本,如Redis 6.2。Download | Redis
Redis的安装,常用命令?
在Linux安装redis6.2.13
第一步:官网下载redis安装包传到Linux中,或者使用wget命令直接下载:
wget https://download.redis.io/releases/redis-6.2.13.tar.gz
(注:要用户对于目录有写权限不然报错)
第二步:使用tar命令解压缩下载的压缩包:
tar -zxvf redis-6.2.13.tar.gz
第三步:进入解压后的目录,使用make命令编译安装redis:
cd redis-6.2.13
make
make install
第四步:修改redis的配置文件,使用vim或其他编辑:
vim redis.conf
修改daemonize为yes,让redis以守护进程的方式运行
修改bind为0.0.0.0,允许远程访问
修改protected-mode为no,关闭保护模式
修改requirepass为一个复杂的密码,设置访问密码
(注:在vim的命令模式可以使用 / + 要搜索的单词 +回车 可以直接定位。n 可以定位下一个)
第五步:使用redis-server命令启动redis服务:
redis-server redis.conf
第六步:使用redis-cli命令进入redis服务窗口,然后就使用redis的命令了:
redis-cli -h 127.0.0.1 -p 6379 -a 密码
然后输入一些命令,如ping、set、get等,可以进行使用redis
Redis命令
Redis 的键只能是字符串类型,也就是说,你可以使用任何二进制序列作为键,这样可以保证二进制安全,也就是说,Redis 不会试图解析或修改键的内容,而只是按照二进制数据存储和读取。Redis 的键的最大长度为 512 MB。
Redis 的键虽然只能是字符串类型,但是它的值可以是多种数据类型,例如字符串、列表、集合、有序集合、哈希、位图、HyperLogLog 和流等
键(Key)命令:
这类命令用于对 Redis 键进行管理,例如设置键的过期时间、删除键、查找键等。
查找键:
KEYS pattern 命令来查找所有符合给定模式(pattern)的键,例如 KEYS ty* 可以查找以 ty 为开头的键。
SCAN cursor [MATCH pattern ] [COUNT count] [TYPE type] 命令也可以来查找数据库中的键,这个命令可以避免 KEYS 命令可能造成的阻塞。
判断键是否存在:
EXISTS key [key...] 命令来检查给定的键是否存在,如果存在返回 1 ,否则返回 0。
查看键的类型:
TYPE key 命令来返回给定键所存储的值的类型,例如 string, hash, list, set, zset 等。
删除键:
DEL key [key...] 命令来删除一个或多个键,如果删除成功返回被删除的键的数量,否则返回 0 。
FLUSHALL 命令清空数据库所有key
设置过期时间:
EXPIRE key seconds 或 PEXPIRE key mill 命令来为给定的键设置过期时间,以秒或毫秒为单位,如果设置成功返回 1 ,否则返回 0。也可以使用 EXPIREAT 或 PEXPIREAT 命令来设置过期时间的时间戳。
查看剩余时间:
TTL key 或 PTTL key 命令来以秒或毫秒为单位返回给定键的剩余生存时间,如果键不存在或没有设置过期时间,返回 -2 或 -1
重命名键:
RENAME key newkey 或 RENAMENX key newkey 命令来修改键的名称,如果修改成功返回 OK ,否则返回错误信息。
RENAME 命令会覆盖新键原有的值。
RENAMENX 命令只有在新键不存在时才会执行。
移动键:
MOVE key db 命令来将当前数据库的键移动到给定的数据库中,如果移动成功返回 1 ,否则返回 0
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SET tykey tyvalue
OK
127.0.0.1:6379> KEYS ty*
1) "tykey"
127.0.0.1:6379> TYPE tykey
string
127.0.0.1:6379> EXPIRE tykey 1000
(integer) 1
127.0.0.1:6379> TTL tykey
(integer) 981
127.0.0.1:6379> RENAME tykey newtykey
OK
127.0.0.1:6379> TTL tykey
(integer) -2
127.0.0.1:6379> DEL newtykey
(integer) 1
127.0.0.1:6379> EXISTS newkey
(integer) 0
字符串(String)命令
这类命令用于对 Redis 字符串值进行操作,例如设置、获取、追加、截取、计数等。
设置和获取字符串值:
SET key value [parameter] 和 GET key 命令来设置和获取指定键的字符串值.
注 :parameter可填项:SET 命令还可以接受一些可选参数,如 NX(只有在键不存在时设置值)、XX(只有在键存在时设置值)、EX(设置键的过期时间,以秒为单位)、PX(设置键的过期时间,以毫秒为单位)。
追加字符串值:
APPEND key value 命令来将指定的字符串值追加到原有值的末尾,如果键不存在,则相当于 SET 命令
截取字符串值:
GETRANGE key start end 命令来返回键中字符串值的子串,指定起始和结束位置,类似于 Java 中的 substring 方法
覆写字符串值:
SETRANGE key offset value 命令来用指定的字符串值覆写键中原有值的一部分,从指定的偏移量开始
获取字符串长度:
STRLEN key 命令来返回键中字符串值的长度
获取和设置多个字符串值:
MGET key [key...] 和 MSET key [key...] 命令来同时获取或设置多个键的字符串值,提高效率。
获取和设置多个字符串值(原子性):
MGETNX key [key...] 和 MSETNX key [key...] 命令来同时获取或设置多个键的字符串值,只有当所有给定的键都不存在或存在时才执行,保证原子性。
获取和设置旧值:
GETSET key value命令来将给定键的值设为新值,并返回旧值。
获取和设置位值:
GETBIT key offset 和 SETBIT key offset values 命令来对 键 中存储的 字符串值 的指定偏移量(下标)上的位进行获取或设置。
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set tykey tyvalues
OK
127.0.0.1:6379> get tykey
"tyvalues"
127.0.0.1:6379> append tykey add
(integer) 11
127.0.0.1:6379> getrange tykey 1 10
"yvaluesadd"
127.0.0.1:6379> setrange tykey 8 aaa
(integer) 11
127.0.0.1:6379> get tykey
"tyvaluesaaa"
127.0.0.1:6379> strlen tykey
(integer) 11
127.0.0.1:6379> MSET key1 value1 key2 value2
OK
127.0.0.1:6379> mget key1 key2
1) "value1"
2) "value2"
127.0.0.1:6379> getset tykey newvalues
"tyvaluesaaa"
127.0.0.1:6379> setbit bitkey 7 1
(integer) 0
127.0.0.1:6379> getbit bitkey 7
(integer) 1
127.0.0.1:6379> getbit bitkey 6
(integer) 0
哈希(Hash)命令
这类命令用于对 Redis 哈希表进行操作,例如添加、删除、修改、获取哈希表中的字段和值。
添加或修改:
HSET key field value [field value ...] 或 HMSET key field value [field value ...] 命令来为哈希表中的一个或多个字段设置值,如果字段不存在则创建,如果字段存在则覆盖。
HSETNX key field value [field value ...] 命令来为哈希表中不存在的字段设置值,保证原子性
删除:
HDEL key field [field...] 命令来删除哈希表中的一个或多个字段,如果删除成功返回被删除的字段的数量,否则返回 0。
获取字段:
HGET key field 或 HMGET key field [field...] 命令来获取哈希表中的一个或多个字段的值,如果字段不存在则返回 nil 。
HGETALL key 命令来获取哈希表中的所有字段和值,以列表形式返回。
判断字段:
HEXISTS key field 命令来检查哈希表中是否存在指定的字段,如果存在返回 1 ,否则返回 0
增加或减少数字值:
HINCRBY key field incr 或 HINCRBYFLOAT key field incr 命令来对哈希表中存储的数字值进行增加或减少操作,支持整数和浮点数
获取字段数量:
HLEN key 命令来获取哈希表中的字段的数量
获取字段名称:
HKEYS key 命令来获取哈希表中的所有字段名称,以列表形式返回
获取字段值:
HVALS key 命令来获取哈希表中的所有字段值,以列表形式返回
迭代字段:
HSCAN key cursor [MATCH pattern ] [COUNT count] 命令来迭代哈希表中的键值对,支持匹配模式和计数参数。
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> hset htykey name "hty"
(integer) 1
127.0.0.1:6379> hset htykey age "18"
(integer) 1
127.0.0.1:6379> hget htykey name
"hty"
127.0.0.1:6379> hget htykey age
"18"
127.0.0.1:6379> hmset htykey sex "man" url "http://xxx.xxx.xxx"
OK
127.0.0.1:6379> hmget htykey sex url
1) "man"
2) "http://xxx.xxx.xxx"
127.0.0.1:6379> hgetall htykey
1) "name"
2) "hty"
3) "age"
4) "18"
5) "sex"
6) "man"
7) "url"
8) "http://xxx.xxx.xxx"
127.0.0.1:6379> hexists htykey name
(integer) 1
127.0.0.1:6379> hdel htykey sex
(integer) 1
127.0.0.1:6379> hlen htykey
(integer) 3
127.0.0.1:6379> hkeys htykey
1) "name"
2) "age"
3) "url"
127.0.0.1:6379> hvals htykey
1) "hty"
2) "18"
3) "http://xxx.xxx.xxx"
127.0.0.1:6379> hset htykey mennoy 100
(integer) 1
127.0.0.1:6379> hincrby htykey mennoy 10
(integer) 110
列表(List)命令
这类命令用于对 Redis 列表(双向链表)进行操作,例如在列表的头部或尾部插入、删除、弹出元素,或者根据索引或值获取元素。
添加元素
LPUSH key element [element...] 命令将一个或多个值插入到列表头部。返回值是插入后列表的长度。
RPUSH key element [element...] 命令在列表中添加一个或多个值到列表尾部。返回值是插入后列表的长度。
注:(如果key不存在,会创建一个空列表并执行添加操作。如果key存在但不是列表类型,会返回一个错误。)
移除元素
LPOP key [count] 命令移出key对应的值列表的count个元素,以移除的元素返回。
RPOP key [count] 命令移除列表的后面的count个元素,以移除的元素返回。
LREM key count value 命令移除列表元素。根据参数count的值,移除列表中与参数value相等的元素。
如果count大于0,从表头开始向表尾搜索,移除与value相等的元素,数量为count。
如果count小于0,从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
如果count等于0,移除表中所有与value相等的值。
返回值是被移除元素的数量。如果key不存在或者不是列表类型,会返回0。。
获取元素
LRANGE key start stop 命令获取列表指定范围内的元素。
注:如果为负数则从最后开始数,如-1为倒数第一个。
修改元素,列表
LSET key index value 命令通过索引设置列表元素的值,以成功值返回
LTRIM key start stop 命令让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除,返回值是操作成功时的信息。
注:如果为负数则从最后开始数,如-1为倒数第一个。
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> lpush ltykey 1 2 3
(integer) 3
127.0.0.1:6379> rpush ltykey 4
(integer) 4
127.0.0.1:6379> lrange ltykey 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> lpop ltykey 2
1) "3"
2) "2"
127.0.0.1:6379> lrange ltykey 0 -1
1) "1"
2) "4"
127.0.0.1:6379> rpop ltykey
"4"
127.0.0.1:6379> lrange ltykey 0 -1
1) "1"
127.0.0.1:6379> lpush ltykey 2 3 4
(integer) 4
127.0.0.1:6379> lrange ltykey 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lset ltykey 2 2
OK
127.0.0.1:6379> lrange ltykey 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lset ltykey 1 2
OK
127.0.0.1:6379> lrange ltykey 0 -1
1) "4"
2) "2"
3) "2"
4) "1"
127.0.0.1:6379> ltrim ltykey 1 2
OK
127.0.0.1:6379> lrange ltykey 0 -1
1) "2"
2) "2"
集合(Set)命令
Set的值不能重复。这类命令用于对 Redis 集合进行操作,例如添加、删除、获取集合中的元素,或者对多个集合进行交集、并集、差集等运算。
添加元素
SADD key member1 [member2 …] 命令向集合添加一个或多个元素。以被添加到集合中的新元素的数量为返回。
删除元素
SPOP key [count] 命令移除并返回集合中的count个随机元素。
注:
如果count参数不给定或者小于等于0,则移除并返回一个随机元素;
如果count参数大于0,则移除并返回count个随机元素;
如果count参数大于等于集合中的元素数,则移除并返回整个集合。
SREM key member1 [member2 …] 命令移除集合中一个或多个元素。返回值是被成功移除的元素数量。
获取,迭代元素
SMEMBERS key 命令返回集合中的所有元素。
SCARD key 命令获取集合的元素数。如果key不存在或者不是集合类型,会返回0。
SRANDMEMBER key [count] 命令返回集合中count个随机元素,但不移除它们。
注:
如果count参数不给定或者等于0,则返回一个随机元素;
如果count参数大于0,则返回count个不重复的随机元素;
如果count参数小于0,则返回|count|个可能重复的随机元素。如果key不存在或者不是集合类型,会返回nil或者一个空列表。
SSCAN key cursor [MATCH pattern] [COUNT count] 命令迭代集合中的元素。以一个新的游标和一个元素列表放回。
注:
cursor是游标,用于标记迭代的位置。MATCH和COUNT参数可选,用于指定匹配模式和每次返回的元素数量。当游标为0时,表示迭代结束。
集合差集
SDIFF key1 [key2 …] 命令返回第一个集合与其他集合之间的差集。
SDIFFSTORE destination key1 [key2 …] 命令将第一个集合与其他集合之间的差集存储到destination中。返回值是结果集中的元素数量。
注:如果destination已经存在,则会被覆盖。
集合交集
SINTER key1 [key2 …] 命令返回所有给定集合的交集。
SISMEMBER key member 命令判断member元素是否是集合key的成员。如果是,返回1;如果不是或者key不存在,返回0。
SINTERSTORE destination key1 [key2 …] 命令将所有给定集合的交集存储到destination中。返回值是结果集中的元素数量。
集合并集:
SMOVE source destination member 命令将member元素从source集合移动到destination集合。返回值是是否成功移动该元素,成功为1,失败为0。
SUNION key1 [key2 …] 命令返回所有给定集合的并集。也就是说,返回那些至少存在于一个给定集合中的元素。
SUNIONSTORE destination key1 [key2 …] 命令将所有给定集合的并集存储到destination中,返回值是结果集中的元素数量。
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> sadd stykey 1 1 2 3 4
(integer) 4
127.0.0.1:6379> smembers stykey
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> spop stykey 2
1) "2"
2) "3"
127.0.0.1:6379> smembers stykey
1) "1"
2) "4"
127.0.0.1:6379> srem stykey 4
(integer) 1
127.0.0.1:6379> smembers stykey
1) "1"
127.0.0.1:6379> sadd stykey 2 3 4 5 5
(integer) 4
127.0.0.1:6379> smembers stykey
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> scard stykey
(integer) 5
127.0.0.1:6379> srandmember stykey 3
1) "3"
2) "5"
3) "1"
127.0.0.1:6379> smembers stykey
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sadd stykey2 5 6 7 8 9
(integer) 5
127.0.0.1:6379> smembers stykey2
1) "5"
2) "6"
3) "7"
4) "8"
5) "9"
127.0.0.1:6379> sdiff stykey stykey2
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sinter stykey stykey2
1) "5"
127.0.0.1:6379> sismember stykey2 9
(integer) 1
127.0.0.1:6379> smove stykey stykey2 3
(integer) 1
127.0.0.1:6379> smembers stykey
1) "1"
2) "2"
3) "4"
4) "5"
127.0.0.1:6379> smembers stykey2
1) "3"
2) "5"
3) "6"
4) "7"
5) "8"
6) "9"
127.0.0.1:6379> sunion stykey stykey2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379>
有序集合命令
有序集合(Sorted Set)和集合(Set)一样也是字符串类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。这类命令用于对 Redis 有序集合进行操作,例如添加、删除、获取有序集合中的元素,或者根据分数或字典序对元素进行排序和范围查询。
注:下面的根据字典排序,只能在当分数相同时才有,有序集合会按照元素的字典顺序进行排序。
注:下面与字典相关的范围区间 min 和 max 必须包含 “(” 或者 “[”,其中 “(” 表示开区间(不包含指定的值),而 “[” 表示闭区间(包含指定的值)2。特殊值 “+” 和 “-” 在 min 和 max 中分别表示正无穷和负无穷。
添加或更新元素:
ZADD key score1 member1 [score2 member2] 命令向有序集合中添加一个或多个成员,或者更新已存在成员的分数。
删除元素:
ZREM key member [member ...] 命令移除有序集合中的一个或多个成员。
移除指定区间内的元素:
ZREMRANGEBYLEX key min max 命令移除有序集合中给定的字典区间的所有成员;
ZREMRANGEBYRANK key start stop 命令移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max 命令移除有序集合中给定的分数区间的所有成员。
计算并存储多个有序集合的交集或并集:
增加元素的分数值:
ZINCRBY key increment member 命令有序集合中对指定成员的分数加上增量 increment。
获取元素个数:
ZCARD key 命令获取有序集合的成员数。
ZCOUNT key min max 命令计算在有序集合中指定区间分数的成员数。
获取元素的排名:
ZRANK key member 命令返回有序集合中指定成员的索引,按分数值从小到大排序;
ZREVRANK key member 命令返回有序集合中指定成员的索引,按分数值从大到小排序。
获取指定区间内的元素:
ZRANGE key start stop [WITHSCORES] 命令通过索引区间返回有序集合指定区间内的成员,按分数值从小到大排序,WITHSCORES是带分数一起返回;
ZREVRANGE key start stop [WITHSCORES] 命令通过索引区间返回有序集合指定区间内的成员,按分数值从大到小排序,WITHSCORES是带分数一起返回;
ZRANGEBYLEX key min max [LIMIT offset count] 命令通过字典区间返回有序集合的成员;
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 命令通过分数返回有序集合指定区间内的成员,WITHSCORES是带分数一起返回。
获取元素的分数值:
ZSCORE key member,返回有序集合中,成员的分数值。
交集,并集
ZINTERSTORE destination numkeys key [key ...] 命令计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中;
ZUNIONSTORE destination numkeys key [key ...] 命令计算给定的一个或多个有序集的并集,并存储在新的 key 中。
案例:
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> zadd ztykey 100 zs 200 ls
(integer) 2
127.0.0.1:6379> zadd ztykey 300 ww 400 lm
(integer) 2
127.0.0.1:6379> ZRANGE ztykey 0 -1
1) "zs"
2) "ls"
3) "ww"
4) "lm"
127.0.0.1:6379> ZREVRANGE ztykey 0 -1
1) "lm"
2) "ww"
3) "ls"
4) "zs"
127.0.0.1:6379> ZRANGEBYSCORE ztykey 100 300
1) "zs"
2) "ls"
3) "ww"
127.0.0.1:6379> ZSCORE ztykey ls
"200"
127.0.0.1:6379> zrem ztykey ls
(integer) 1
127.0.0.1:6379> zrange ztykey 0 -1
1) "zs"
2) "ww"
3) "lm"
127.0.0.1:6379> ZREMRANGEBYSCORE ztykey 100 200
(integer) 1
127.0.0.1:6379> zrange ztykey 0 -1
1) "ww"
2) "lm"
[root@bogon redis-6.2.13]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> zadd ztykey2 100 g 100 t 100 a 100 b
(integer) 4
127.0.0.1:6379> zrange ztykey2 0 -1
1) "a"
2) "b"
3) "g"
4) "t"
127.0.0.1:6379> zrange ztykey2 0 -1 withscores
1) "a"
2) "100"
3) "b"
4) "100"
5) "g"
6) "100"
7) "t"
8) "100"
127.0.0.1:6379> ZRANGEBYLEX ztykey2 [a (c
1) "a"
2) "b"
127.0.0.1:6379>