1.为什么我们需要redis?
因为redis是在我们的内存中实现缓存的 因此读取速率比在硬盘中的MySQL快上很多 在某些特定的场景 几秒钟信息量特别大的时候尤其用的多
对于关系型数据库,即使做到了分库分表,它的读写速度也只能达到1W+ 很显然不能适用于高并发的场景
而Reids这类非关系型数据库,读写速度可以达到10W+每秒,于是常用作缓存,是能够顶住大部分场景的冲击的。
2.关系型数据库和非关系型数据库
关系型数据库:即我们常用的MySQL等数据库,它的语言被称为SQL(structured query language)
我们知道关系型数据库的内部模型其实就是一个二维表,之所以它们被称为关系数据库而不是表数据库
就是因为在数据库中:关系比表更加重要
非关系型数据库:
noSQL(not only SQL) 也有人称它为文档型数据库
比如我们对不同的表增加同一个ID标签,就能在查询的时候进行关联
3.Redis(Remote Dictionary Server 远程字典服务器 )是一个由C语言编写的,开源的高性能非关系型的键值对数据库,它以字典结构存储数据。并允许其他应用通过TCP协议读写字典中的内容。
4.Redis支持的键值对数据类型如下
-
字符串 string
-
散列 list
-
列表 list
-
集合
这种存储结构域MySQL等关系数据库的二维表形式的存储结构有很大的差异。举个例子
post["title"]="Hello World"
post["content"]= "Blablabla..."
5.内存存储与持久化
Redis数据库中的所有数据都存储在内存中,由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库,不过在程序退出后内存中的数据会丢失,不过redis提供了持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务
6.启动服务端
redis-server.exe
启动客户端
重新开一个cmd
双击redis-cli.exe程序
或者
redis-cli.exe -h 127.0.0.1 -p 6379 //服务器地址和端口号默认
停止redis
考虑到Redis有可能正在将内存中的数据同步到硬盘中,强行终止Redis进程可能会导致数据丢失,正确停止Redis的方式应该是向Redis发送SHUTDOWN命令
reids-cli SHUTDOWN
7.redis配置:
config set config_setting_name new_config_value
//栗子
//config set loglevel "notice"
8.Redis数据类型
1.string //redis最基本的数据类型,是一种键值对类型
特点:二进制安全,即reids的string可以包含任何数据,比如jpg图片或者序列化的对象,最大能存储512MB的值
栗子:
redis 127.0.0.1:6379>SET mystring "xiaocheng"
OK
redis 127.0.0.1:6379>GET mystring
"xiaocheng"
2.Hash
redis hash是一个键值对集合。其底层是一个string类型的filed和value的映射表,hash特别适合用于存储对象。
栗子:
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World""OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
在这个例子中使用了redis的HMSET和HGET命令,HMSET设置了两个field=>value对,HGET获取对应filed对应的value
每个hash可以存储2的32次方-1键值对 大概有四十多亿
3.List
list是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)
栗子:
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabbitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 101) "rabbitmq"2) "mongodb"3) "redis"
上面的栗子使用了lpush添加元素
lrange加上左右边界 就能够遍历从左边界到右边界的list
list最多也可存储2的32次方-1个元素
4.Set
redis的set是string类型的无需集合,通过哈希表实现,所以添加,删除,查找的复杂度都是O(1),因为是hash表,所以set里的元素具有唯一性
栗子:
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabbitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabbitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"2) "rabbitmq"3) "mongodb"
以上示例中rabbitmq添加了两次,但因为set中元素的唯一性,所以第二次添加的元素将被忽略
sadd:添加set中的元素
smembers:获取set中的元素
set中的最大成员数也为2的32次方-1
5.zset(sorted set:有序集合)
和set一样,string类型元素的集合,且不允许重复的成员。
不同:每个元素都会关联一个double类型的分数,redis正式通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数却可以重复
栗子:
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 10001) "mongodb"2) "rabbitmq"3) "redis"
zadd:添加元素 第一个值是分数 第二个是string类型的值
zrangebyscore:通过分数进行排序输出 后面两个参数是分数的范围 如果两个string分数一致的话 那么就通过string的排序进行先后输出
9.redis命令:
redis命令需要作用在redis服务上执行操作,要在redis服务上进行操作就需要一个redis客户端。
redis客户端:
redis-cli
redis服务端:
redis-server.exe
11.redis key
redis键的基本语法如下:
command keyname
示例:
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1
//以上示例 set是一个命令 runoobkey是一个键 redis是值 del也是命令
第一条语句是将runoobkey的值设置为redis
第二条语句是删除runoobkey键
//如果成功了则输出(integer) 1 否则输出(integer) 0
最常用的操作redis key的命令
del key //在key存在时删除key
exists key //检查给定key是否存在
rename key newkey //重命名key
type key //返回key所存储的值的类型
12.redis string
redis string 相关命令用于管理redis string的值,基本语法如下:
redis 127.0.0.1:6379>command key_name
栗子:
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> GET runoobkey
"redis"
常用redis string commond:
set key value //设置指定key的值
get key //获取指定key的值
setnx key value //只有在key不存在时设置key的值
strlen key //返回key所存储的字符串值的长度
13.redis hash
redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
栗子:
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"2) "redis tutorial"3) "description"4) "redis basic commands for caching"5) "likes"6) "20"7) "visitors"8) "23000"
在上述的栗子中,我们设置了redis的一些描述信息:
name:2
description:redis basic commands for caching
likes: 20
visitior:23000
//注意存储的都是字符串类型 在redis里面没有整数类型
redis hash command:
hdel key field1 //删除一个hash字段
hdel key all //删除整个hash表
hget key field //获取存储在hash表中特定字段的值
hgetall key //获取在哈希表中指定key的所有字段和值
hkeys key //获取哈希表中的所有字段
hlen key//获取哈希表中字段的数量
hmset key field1 field2//获取所有给定字段的值
hmset key field1 value1 field2 value2 //同时
hvals key//获取哈希表中所有值
14.redis list
redis list是简单的字符串列表,按照插入顺序排序,可以添加一个元素到头部或者尾部
一个列表最多可以包含2的32次方-1个元素
栗子:
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10
1) "mysql"2) "mongodb"3) "redis"
在以上示例中 使用了lpush将三个值插入到了名为runoobkey的列表当中
并通过lrange key 0 10 把runnoobkey中下表从0到10的值全部读取出来
redis list command:
blpop key timeout //移除并获取列表的第一个元素
brpop key timeout //移除并获取列表的最后一个元素
lindex key index //通过索引获取列表中的元素
llen key//获取列表长度
lpush key value1 (value2) //将一个或多个值插入到列表头部
lpushx key value //将一个值插入到已存在的列表头部
lrange key start stop//获取列表指定范围内的元素
del key//删除列表
15.redis set
redis的set是string类型的无需集合,集合成员是唯一的,集合对象的编码可以是intset或者hashtable
Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
最大的成员数也是2的32次方-1
栗子:
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"2) "mongodb"3) "redis"
//在上面的demo中我们通过sadd命令向 key 为runoobkey的set中插入了三个元素,然后使用smembers读取出了key里面的值
redis set command:
sadd key member1【member2】 //像集合中添加一个或者多个成员
scard key //获取集合中的成员数
sismember key member //判断member元素是否是集合key的成员
smembers key //返回集合中的所有成员
spop key //移除并返回集合中的一个随机元素
del key //删除一个集合
16.redis zset
redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但score却可以重复
有序集合也是通过哈希表实现的,所以添加 删除 查找的复杂度都是O(1)
栗子:
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"2) "1"3) "mongodb"4) "2"5) "mysql"6) "4"
//在上面的demo 中我们通过zadd命令向 key为runoobkey的zset中添加元素 其中 数字是元素的score 字符串是元素的value
redis zset command:
zadd key score1 member1 (score2 member2) //向有序集合添加一个或者多个成员
zcard key //获取有序集合的成员数
zcountkeystop (withscores) //通过索引区间返回有序集合指定区间内的成员
zrangebyscore key min max (withscores) //通过分数返回有序集合指定区间内的成员
zrank key member //返回有序集合中指定成员的索引
zrem key member (member2) //移除有序集合中的一个或者多个成员
zscore key member//返回有序集合中,成员的分数值
del key//删除一个有序集合
17.redis HyperLogLog
redis在2.8.9版本添加了HyperLogLog结构
它是用来做技术统计的算法
优点:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的,而且很小
在redis里,每一个HyperLogLog只需要花费12KB内存,就可以计算接近2的64次方个不同元素的基数。
这和计算基数时,元素越多耗费内存就越多的集合形成了鲜明的对比。
但是因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样返回输入的各个元素
基数:一个数据集内不重复元素的个数
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
redis HyperLogLog command:
pfadd key element (element) //添加指定元素到HyperLogLog中
pfcount key //返回给定HyperLogLog的基数估计值
pfmerge destkey sourcekey (sourcekey) //将多个HyperLogLog合并为一个
18.redis发布订阅
redis发布订阅是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息
redis客户端可以订阅任意数量的频道
demo:
第一个redis-cli:
redis 127.0.0.1:6379> SUBSCRIBE runoobChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
第二个redis-cli:
redis 127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test"
(integer) 1
redis 127.0.0.1:6379> PUBLISH runoobChat "Learn redis by runoob.com"
(integer) 1
# 订阅者的客户端会显示如下消息
1) "message"
2) "runoobChat"
3) "Redis PUBLISH test"
1) "message"
2) "runoobChat"
3) "Learn redis by runoob.com"
//第一个cli的subscribe命令表示订阅runoobChat频道
第二个cli输入publish命令表示往runoobChat频道发送消息 这个时候第一个cli就会看见第二个cli客户端发送的测试消息
redis pub/sub command:
psubscribe pattern //订阅一个或者多个频道
pubsub subcommand //查看订阅与发布系统状态
publish channel message //将信息发送到指定的频道
punsubscribe pattern1 (pattern2) //退订所有给定模式的频道
subscribe channel (channel) //订阅给定一个或多个频道的信息
unsubscribe channel //退订给定的频道
19.redis事务:
redis事务可以一次执行多个命令,并且带有一下三个重要的保证:
-
批量操作在发送exec命令前被放入队列缓存
-
收到exec命令后进入事务执行,事务中任意命令执行失败,其他的命令依然被执行
-
在事务执行过程,其他客户端提交的命令请求不会被插入到事务执行命令序列中
一个事务从开始到执行会经历以下三个阶段:
单个redis命令的执行是原子性的,但redis没有在事物上增加任何维持原子性的机制,所以redis事务的执行兵不是原子性的。
事务可以理解为一个打爆的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
demo:
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec1) OK
2) OK
3) OK
如果在set b执行时失败
那么set a 已经执行成功 不会回滚
set c 还会继续执行
redis transaction command:
discard//取消事务,放弃执行事务块的所有命令
exec//执行所有事务快的命令
multi//标记一个事务快的开始
unwatch //取消watch命令对key的监视
watch key1 (key2) //监视一个或者多个key 如果在事务执行之前这些key被其他命令改动,那么事务将被打断
20.redis连接
redis connect command:
auph password //验证密码是否正确
echo message //打印字符串
ping //查看服务是否运行
quit //关闭当前连接
select index //切换到指定的数据库
21.redis 脚本
redis脚本使用lua解释器来执行脚本。redis 2.6版本通过内嵌支持lua环境,执行脚本的常用命令为EVAL
关于lua:一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序当中,从而为应用程序提供灵活的扩展和定制功能。
应用场景:
-
游戏开发
-
独立应用脚本
-
web应用脚本
-
扩展和数据库插件
-
安全系统,如入侵检测系统
Eval命令的基本语法:
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
redis lua command:
evla script numkeys key...arg... //执行lua脚本
evalsha sha1 numkeys key //执行lua脚本
script fulsh //从脚本缓存中移除所有脚本
script kill //杀死当前正在运行的lua脚本
22.redis stream 是redis 5.0版本新增加的数据结构
redis stream主要用于消息队列,redis本身使用一个redis发布订阅来实现消息队列的功能,但它有个缺陷就是消息无法持久化,如果出现网络断开,redis宕机等情况,消息就会被抛弃。
简单来说发布订阅(pub/sub)可以粉发消息,但无法记录历史信息
23.redis的缺点:
-
因为其是存储在内存中的,即使可以持久化,但也容易丢失
-
redis属于kv型非关系型数据库,即只能由k找到v,而不能由v找到k
-
redis过于依靠硬件,即使现在内存价格降低了,但对于redis仍然昂贵
24.go使用mysql
我用的是
"github.com/garyburd/redigo/redis"
其中有conn接口
conn接口的do函数可以执行redis命令,参数和redis-cli命令参数格式一致。
25.在很多框架里面我们能看见args变量,那么它到底是个什么东西呢
它一般是一个字符串变量名,总的来说就是个存放字符串数组用的,是arguments的缩写。
26.redis各种数据类型的应用场合
-
string: 不知道用什么就用string,因为string是redis中最基本也是最简单的数据类型
-
hash:存储、读取、修改、删除用户属性
-
list:最新消息排行等功能;消息队列
-
set:共同好友 利用唯一性,统计访问网站的唯一ip
-
sorted set:排行榜 带权重的消息队列
27.redis常用场景
-
高并发下的数据缓存,比如在某个场景下,大量日志同时写入数据库会给服务器带来巨大压力,可以先将数据写入redis中,再由redis写入数据库,减轻同时写入压力
-
热点信息快速显示,如果有一个新闻首页,需要快速显示各栏目前20条热点新闻,如果直接查库的话,在大量用户同时访问下,会同时有很多数据库请求,这时就可以用redis进行优化,在新闻录入时将标题、时间、来源等写入redis中,客户端访问时,可以从内存中一次性取出当天热点新闻列表,极大地提高请求速度和节约了服务器开销
-
保存会话信息,可以将登录后用户信息缓存入redis并同时设置key过期时间,这样后台api过滤请求时,就可以从内存中读取用户信息,而且redis的过期机制,天然支持用户身份有效期校验,用起来十分方便
-
统计计数 ,可以用incrby命令统计计数
-
其他场景:队列、发布订阅等等
1.redis启动方法:有直接启动和初始化脚本启动两种方式
直接启动:
-
redis-server
-
redis-server --port 6380 //指定6380端口启动
初始化脚本启动(linux):
2.停止redis
关闭redis的时候可能正在将内存中的数据同步到硬盘中,强行终止redis进程可能会导致数据丢失,正确的停止redsi的方式应该是发送SHUTDOWN命令
在redis收到shutdown命令后,会先断开所有客户端的连接,然后根据配置执行持久化,最后退出
3.redis客户端登录
-
redis-cli
-
redis-cli -h 127.0.0.1 -p 6379 //指定服务器和端口号登录
4.redis数据库:redis默认支持16个数据库,每个数据库对外都是一个从0开始的递增数字命名,客户端和redis连接后默认会自动连接到0号数据库,这些数据库的名字不允许修改,另外redis不支持对于为每个数据库设置不同的密码,所以一个客户端要么能访问全部的数据库,要么一个也访问不了,最重要的是:多个数据库之间并不是完全隔离的。比如FLUSHALL命令可以清空一个Redis实例中所有数据库的数据
5.glob风格通配符格式
符号
|
含义
|
?
|
匹配一个字符
|
*
|
匹配任意个字符(包括0个)
|
【】
|
匹配括号间的任一字符,可以使用“-”符号表示一个范围,如a[b-d]可以匹配ab\ac\ad
|
\x
|
匹配字符x,用于转义符号。如要匹配‘?’
就需要使用\?
|
6.redis命令是不区分大小写的
7.key命令:
-
keys * //遍历redis中所有的键,在键数量较多时会影响性能,不建议在生产环境中使用
-
exists key //判断键是否存在 如果存在返回1 否则返回0
-
del key [key...] //可以删除一个或者多个键 返回值是删除的键的个数
-
type key //获取键值的数据类型
-
set key value //赋值
-
get key //取值
8.字符串类型命令
-
自增命令 incr key //当存储的字符串是整数形式时,incr能让当前键值递增,并返回递增之后的值 键值不是整数时redis会报错
-
如果同时多个客户端连接到redis时可能出现竞态条件(race condition:指一个系统或者进程的输出,依赖于不受控制的时间的出现顺序或者出现时间),例如有两个客户端A和B都要执行incr命令并准备将同一个键的键值增加,结果虽然是对键执行了两次递增操作,但最后以后的键值是增1而不是增2,因为所有的Redis命令都是原子操作(atomic operation)
-
incrby key increment //增加指定的整数
-
decr key //自减命令
-
decrby key decrement//减少指定的整数
-
incrbyfloat key increment //增加指定的浮点数
-
append key value //向尾部增加值
-
strlen key //获取字符串长度
-
mget key [key...] //与get类似 不过可以获得多个键的键值
-
mset key value [key value...] //与set类似 不过可以同时设置多个键
9.散列类型命令:
散列:一个key具有多个属性和value
栗子:
一个叫做car的key:
car name:BMW
car price:500
car time:2021
-
hest key field value //给key的一个field赋值 不区分插入和更新
-
hget key field //取得key的一个field中的值
-
hmset key field value [field value ...] //多个field赋值
-
hmget key field [field..] //多个field取值
-
hgetall key //取所有field的值
-
hexists key field //判断字段是否存在 存在返回1 不存在返回0
-
hsetnx key field value //当字段不存在时赋值
-
hincrby key field increment //给key中的一个字段增加数字
-
hdel key field[field...] //删除多个字段
-
hkeys key //获得所有字段的名字
-
hvals key //获得所有字段值
-
hlen key //获取字段数量
10.列表类型命令:由双向链表实现
优点:插入和删除速度快
缺点:根据索引查询的速度慢
如果想把列表当成栈 则搭配使用lpush和lpop/rpush和rpop
如果想要把列表当成队列 则搭配使用lpsuh和rpop/rpush和lpop
-
lpush key value [value...] //向列表左侧添加元素
-
rpush key value [value...] //向列表右侧添加元素
-
lpop //左边弹出一个元素
-
rpop //右边弹出一个元素
-
llen key //获得元素个数
-
lrange keys start stop //遍历 从左索引到右索引
-
lrem key count value //删除count个指定为value的值 当count>0 从左边开始删 当count<0 从右边开始删 当count=0 全删
-
lindex key index //获取索引的元素值
-
lset key index value //设置指定索引的元素值
-
ltrim key start end //保留指定片段
-
rpoplpush source destination //将元素从一个列表转移到另一个列表 将source最右侧元素弹出 加入到destination表的最左侧
-
linsert key before|after pivot value //插入元素 首先找到pivot元素 根据第二个参数决定插入到前面还是后面
11.集合类型命令
13.redis事务
Redis中的事务是一组命令的集合,事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
事务的原理是将一个属于事务的命令发送给Redis 然后再让redis依次执行这些命令
事务使用方式
-
multi //开启事务
-
..... //执行命令
-
exec //结束事务
14.Redis错误处理
-
语法错误:指令不存在或者命令参数格式错误 这种错误Redis会直接返回错误,哪怕有一部分正确的命令,redis也不会执行
-
运行错误 指在运行过程中出现的错误,比如使用散列类型命令操作集合类型的键 这种错误在实际执行前是不会发现的 如果事务中的一条命令出现了运行错误 那么事务中的其他命令仍然会继续执行
-
Redis事务没有回滚功能,所以开发者必须在事务执行出错时自行处理错误,这也是得Redis在事物上可以保持简洁和高效
lpop key //左边
15.WATCH命令
Watch命令可以监控一个键或多个键 一旦其中一个键被修改 之后的事务就不会执行
监控可以持续到EXEC命令执行
UNWATCH:取消监控
16.过期时间命令
-
expire key seconds //设置过期时间
-
ttl key //查看还有多久到过期时间
-
persist key //取消键的过期时间 即让键恢复为永久
-
pexpire key millisecond //设置键的过期时间 毫秒级别
17.排序命令:sort
-
sort key //对数字进行排序 什么类型都可以 如果是对zset排序 那么会忽略元素都分数
-
sort key alpha //按照字典顺序排序非数字元素