2. Redis常见命令
2.1 Redis数据结构介绍
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样
Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( http://www.redis.cn/commands.html )可以查看到不同的命令:
也可以使用help命令查询命令:
思考:
Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?
例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1key的结构
Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:
项目名:业务名:类型:id
这个格式并非固定,也可以根据自己的需求来删除或添加词条。
例如我们的项目名称叫 shop,有user和order两种不同类型的数据,我们可以这样定义key:
- user相关的key:shop:user:1
- order相关的key:shop:order:1
2.2 Redis的数据结构之字符串
String 是redis最基本的数据结构,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的,意思就是redis的String可以包含任何数据。比如jpg图片或者序列化的对象,String类型是Redis最基本的数据结构,String类型的值最大能存储512MB。
存储String常用命令:
1) 赋值
使用set key value 的语法
例如:
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX:添加一个String类型的键值对,并且指定有效期
2) 取值
使用get key方式获取值
例如:
3) 删除
使用del key方式删除
例如:
也可以一次性删除多个key
4) 数值增减
- incr 自增 默认没有定义的key,对应的value默认为0 加1
如果key对应的value不是一个整数,使用incr会报错:
- decr 自减 与自增很相似 减1
5) 扩展命令
- incrby 指定增量值
- decrby 指定减量的值
- append 追加字符串,如果没有定义,直接赋值
- keys *查看redis的所有的key
2.3 Redis的数据结构之哈希
存储的value是一个hash结构,而hash结构就是一个String key和String value组成的map容器。Hash特别适合用于存储对象, Redis中每个hash可以存储232-1键值对(4294967295)。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
存储Hash常用的命令:
- 赋值
- 存储单个字段 hset key fieldname fieldValue
如上代码,表示往redis存储了一个user, user的name的属性对应的值为zhangsan
- 存储多个字段hmset key fieldname1 fieldValue1 fieldname2 fieldValue2…
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
- 取值
-
获取指定key的指定的属性的值 hget key fieldName
-
获取指定key的多个属性值 hmget key fieldName1 fieldName2…
-
获取指定key的所有属性名和属性值 hgetall key
- 删除
- 删除指定key的一个属性或者多个属性 hdel key fieldName1 [fieldName2 …]
- 增加数字
- hincrby 给某个属性值为整数的属性增加 hincrby key fieldname 增量
- 判断key是否存在
- 判断某个key对应的属性是否存在, 1表示存在,0表示不存在 hexists key fieldname
- 获取hash属性的个数
- 获取hash的属性的个数: hlen key
- 获取hash所有属性
- 获取所有属性的属性名 hkeys key
- 获取所有的属性的值 hvals key
2.4 Redis的数据结构之List
Redis列表是简单的字符串列表,插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含2的32方 – 1个元素。
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等
存储List常用的命令
- 两端添加
- 从左边开始添加 lpush key value1 value2 …
- 获取指定范围的集合元素 lrange key 开始下标 结束下标 注意:-1表示最后下标
- 从右端开始添加元素(我们比较习惯这种方式) rpush key value1 value2…
-
往list集合头部插入元素 lpushx key value
-
往list集合尾部插入元素 rpushx key value
- 两端弹出
- 从list左侧(头部)弹出集合元素 lpop key 删除头部元素
- 从list 右侧弹出集合元素 rpop key 删除尾部元素
- 查看list集合的元素的个数 llen key
- 从list集合的指定的方向删除指定个数的指定元素 lrem key count value
注意: count 表示删除多少个 如果为正数 表示从左边开始,负数表示从右边开始, 0表示删除所有
从左侧删除2个3:
从list右侧删除2个2
删除所有的1
- 修改指定下标上的值 lset key index value
注意: index 表示下标,从0开始
把下标为2的元素修改为hello
- 在指定位置插入指定的元素: linsert key before/after value1 value2
注意: before 表示在value1之前插入value2
after 表示在value1之后插入value2
在hello元素之前插入 me
在hello之后插入world
- 把某个集合的尾部元素弹出并插入到另外一个集合的头部
rpoplpush key1 key2
比如把l1集合的尾部元素弹出,并插入到l2集合的头部
2.5 Redis的数据结构之Set
Set与list类型不同的是,set集合中不允许出现重复的元素,set集合最大可以存储2的32方-1个元素. Set集合使用的场景, 就是在跟踪一些唯一数据.
Set集合常用的方法:
- 添加set元素 sadd key value1 value2 ….
添加一个set1的集合,该集合包含a,b,c 3个元素
- 查看set集合的元素 smembers key
查看set1集合的元素
- 删除set集合中的元素 srem key value1 value2 …
删除set1集合的a元素
- 判断set集合中某个元素是否存在, 返回1表示存在, 返回0表示不存在 sismember key value
判断set1集合中是否包含b
- 计算多个集合的差集 sdiff key1 key2 …
注意:上述命令表示,统计出元素在key1存在,但是不存在key2的元素
统计在set2存在,但是不存在与set3的元素:
统计在set3存在,但是不存在与set2的元素:
注意: sdiff 集合的位置不一样,得到的结果也不一样.
- 计算多个集合的交集, sinter key1 key2 …
统计set2,set3的交集(即存在与set2,又存在与set3的元素)
- 计算多个集合的并集 sunion key1 key2 …
统计set2和set3集合的并集
- 计算集合的元素的个数: scard key
统计set2集合的元素个数:
- 把多个集合的差集存储到一个新的集合中 sdiffstore 新集合名 集合1 集合2…
把set2,set3的差集保存到n1集合:
- 把多个集合的交集结果存储到新集合 sinterstore 新集合名 集合1 集合2….
把set2,set3集合的交集保存到n2集合中:
- 把多个集合的并集结果存储到新集合 sunionstore 新集合名 集合1 集合2 …
把set2和set3的并集的结果存储到n3集合中:
2.6 Redis的数据结构之sorted-set/ZSet
Sorted-Set与Set的区别在于:Sorted-Set中的成员在集合中的位置是有序的. Sorted-Set集合使用的场景是:大型在线游戏积分排行榜.
- 添加元素,包括评分和值, zadd key score1 value1 score2 value2…
添加集合sort1,该集合的元素是a,b,c.对应的评分为 5,4,6
注意:
sorted-set集合的默认排序是按照评分的升序排序
如果我们继续给集合添加元素,如果集合的元素已经存在,则覆盖,如果元素不存在,那这个元素就添加进去.
- 查找元素: zrange 开始下标 结束下标
注意: -1表示最后一个 默认是评分的升序排序
查找sort1的所有元素:
如果想把元素的评分也打印出来, 则在后面添加withscores
- 删除元素 zrem key value1 value2 ….
删除sort1集合中的b元素
- 查看集合的元素个数 zcard key
查看sort1集合的元素个数:
- 降序打印集合元素
zrevrange key 开始下标 结束位置 [widthscores]
把sort1集合的元素降序输出:
- 根据具体评分范围来删除元素
zremrangebyscore key min max
**注意:** min 表示最小评分, max表示最大评分, 包括最小和最大评分
删除sort1集合评分在8-12之间的所有元素:
- 根据评分范围来查找元素
zrangebyscore key min max [withscores] [limit 开始 个数]
注意:
withscores 表示输出评分
limit 用于分页 序号从0开始
查询sort1集合中评分在 4-10之间的元素:
查询sort1集合中评分在 4-10之间的元素:并且输出评分:
查询sort1集合中评分在4-10之间的元素,并且进行分页
- 给指定的元素加分 zincrby key score value
给sort1集合的c元素加4分
- 查找指定评分范围的元素个数: zcount key min max
查找sort1集合中评分在4-10之间的元素个数:
2.7 redis keys的通用操作
- 显示所有的key keys *
- 查找以指定字符开头 keys 指定字符串*
查找以s开头的
- 查找以指定字符串开头,后面紧跟任意一位字符 keys 指定字符串?
查找以n开头,后面紧跟一位任意字符:
- 删除 指定的key del key1 key2…
删除n1 n2 n3
- 判断key是否存在 1表示存在 0表示不存在 exists key1 key2…
判断n1是否存在,判断set1是否存在:
- 对key重命名: rename oldKey newKey
把set1的名字设置为set4
- 设置key的有效时间 expire key time
注意: 以秒作为单位
设置set4 的有效时间为10s
- 查看key的剩余有效时间 ttl key
注意: -2表示该key不存在
- 显示key的类型 type key
- 删除redis中所有的key flushall