一、help操作
- 1.进入客户端
redis-cli
- 2.查看帮助
help几种方式:有问题就通过help查看怎么使用
Type: "help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
举例: help @string
APPEND key value
summary: Append a value to a key
since: 2.0.0
BITCOUNT key [start] [end]
summary: Count set bits in a string
since: 2.6.0
查看客户端如何使用:redis-cli -h
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1).
-p <port> Server port (default: 6379).
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server.
-r <repeat> Execute specified command N times.
-i <interval> When -r is used, waits <interval> seconds per command.
It is possible to specify sub-second times like -i 0.1.
-n <db> Database number.
-x Read last argument from STDIN.
-d <delimiter> Multi-bulk delimiter in for raw formatting (default: \n).
-c Enable cluster mode (follow -ASK and -MOVED redirections).
--raw Use raw formatting for replies (default when STDOUT is
抽取部分介绍:
-h:连接不同的地址
-p:接端口号
-n:切换不同的库
-raw:这个支持查看中文(防止有中文乱码无法查看)
二、redis的数据模型
原则:
- tip1.不管放入redis中的是什么类型的数据,放在底层的都是二进制字节数组的格式存放。客户端取的时候需要自己来转换。
既:Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值 - tip2.key取值原则
键值不需要太长,消耗内存,且在数据中查找这类键值的计算成本较高
键值不宜过短,可读性较差
第一种:字符串的操作
- 1 String常用操作
- 基本操作是字符串操作,追加,截取
set,get,append,strlen …
备:一个字符串类型的值最多能存储512M字节的内容
- 2.查看的几种方式
-
keys * :获取所有的key
// 亦可以通过 keys XXX* 模糊检索 只可用 * 模糊匹配get key:get后接key值就可查看value值
- KEYS pattern // pattern取值如下:
* 任意长度字符
? 任意一个字符
[] 字符集合,表示可以是集合中的任意一个
eg:keys s*
keys s?
keys s[13]
keys *
keys ??
- 3.set的用法:
- 设置字符串值 set get
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX 设置过期时间,秒,等同于SETEX key seconds value
PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value
NX 键不存在,才能设置,等同于SETNX key value
XX 键存在时,才能设置
eg:set se abc ex 15
意味着15秒后过期。 - Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除
设置在指定Unix时间戳过期EXPIREAT key timestamp
PEXPIREAT key milliseconds-timestamp
eg:EXPIREAT cache 1355292000
PEXPIREAT mykey 1555555555005 - 删除过期:
PERSIST key
- 清空数据库:
flushall (清空全部节点数据库数据慎重) 或 FLUSHDB(清空当前数据库数据) flush 数据库编号 (清指定数据库数据)
- 设置多个键的字符串值
MSET key value [key value ...]
键不存在时,设置字符串值
MSETNX key value [key value ...]
注意:这是原子操作,全成功或者全失败 - 生存时间
Time To Live,Key的剩余生存时间
- 查看剩余生存时间
TTL key
PTTL key
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
- 4.键类型
TYPE key
object encoding key
key:
v:(K1)
type:string
enco..(raw/int)
strlen:2
指针 value地址
encoding,strlen:增删改:更新 查询长度,还是数值计算,成本很高
键是否存在EXISTS key
键重命名RENAME key newkey
RENAMENX key newkey
键删除DEL key [key ...]
- 5.字符串获取等操作
- 5.1获取单个给定的键的值
GET key
- 5.2获取多个给定的键的值
MGET key [key ...]
- 5.3返回旧值并设置新值
GETSET key value
// 便捷的用法
如果键不存在,就创建并赋值 - 5.4字符串长度(2进制安全,中文体现 - - raw 命令)【字节长度】
STRLEN key
object encoding key > val 底层存储的数据结构类型e - 5.5追加字符串
APPEND key value
如果键存在就追加;如果不存在就等同于SET key value - 5.6获取子字符串 索引
GETRANGE key start end
0 3
索引值从0开始,负数表示从字符串右边向左数起,-1表示最后一个字符
01234
1a2a3a
-5 -4 -3 -2 -1 - 5.7覆盖字符串
SETRANGE key offset value
- 6.步进/退操作
- 步长1的增减
INCR key
DECR key
eg:set tc 100
INCR tc
get tc
"101"
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
步长增减 floatINCRBY key decrement // decrement 指定值
DECRBY key decrement
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
支持浮点:
- 7.位图bitmap 【字节数组】
- 位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512M字节的内容
位上限:2^(9+10+10+3)=2^32b
设置某一位上的值SETBIT key offset value (0/1)
offset偏移量,从0开始
获取某一位上的值GETBIT key offset
返回指定值0或者1在指定区间上第一次出现的位置偏移量BITPOS key bit [start] [end]
bitpos k1 1 1 1
k2: 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
k3: 0 1 0 0 0 0 1 0
0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0
setbit k1 1 1 - 统计指定位区间上值为1的个数 字节
bitpos key bit(0/1) start end // start end bit位的索引
BITCOUNT key [start] [end] // start end Byte位的索引 正负方向
set k ab bitcount k 1 1
从左向右从0开始,从右向左从-1开始,注意官方start、end是位,测试后是字节BITCOUNT testkey 0 0
表示从索引为0个字节到索引为0个字节,就是第一个字节的统计BITCOUNT testkey 0 -1等同于BITCOUNT testkey
最常用的就是 BITCOUNT testkey
- 8.位操作
-
0 1 0 0 0 0 0 1
1 1 1 0 0 0 0 1
0 1 0 0 0 0 0 1
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种BITOP AND destkey key [key ...]
,对一个或多个 key 求逻辑并,并将结果保存到 destkeyBITOP OR destkey key [key ...]
,对一个或多个 key 求逻辑或,并将结果保存到 destkeyBITOP XOR destkey key [key ...]
,对一个或多个 key 求逻辑异或,并将结果保存到 destkeyBITOP NOT destkey key
,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
空的 key 也被看作是包含 0 的字符串序列
第二种:List列表 数组的操作
(基于Linked List实现)
- 1.命令说明
B block 块,阻塞
L left 左
R right 右
X exist 存在 - 2.左右或者头尾压入元素 string set key “abc”
LPUSH key value [value ...]
LPUSHX key value
RPUSH key value [value ...]
RPUSHX key value
备:注意,lpush是在一个不存在的key里放value。而不是在已有的基础上加。 - 3.左右或者头尾弹出元素
LPOP key
RPOP key - 4.从一个列表尾部弹出元素压入到另一个列表的头部 string getset
RPOPLPUSH source destination
- 4.返回列表中指定范围元素
LRANGE key start stop
LRANGE key 0 -1 表示返回所有元素
备:既查看的方式。注意,push进去的,不要用get key的方式。
其中,-1 表示最后一位,以此类推,去查看。 - 5.获取指定位置的元素
LINDEX key index
- 6.设置指定位置元素的值
LSET key index value
- 7.列表长度,元素个数 string strlen
LLEN key LRANGE KEY 0 -1
- 8.从列表头部开始删除值等于value的元素count次,LIST 可以重复出现
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
举例RPUSH listkey c abc c ab 123 ab bj ab redis list
LREM listkey 2 ab
LRANGE listkey 0 -1 - 9.去除指定范围 外 元素
LTRIM key start stop
举例RPUSH listkey c abc c ab 123 ab bj ab redis list
LTRIM listkey 0 -1
LTRIM listkey 1 -1
LTRIM listkey 1 10000
应用案例:微博的评论最后500条:盖楼lpush u1234:forumid:comments comments
LTRIM u1234:forumid:comments 0 499 - 10.在列表中某个存在的值(pivot)前或后插入元素
LINSERT key BEFORE|AFTER pivot value
key和pivot不存在,不进行任何操作
举例:RPUSH lst Clojure C Lua
LINSERT lst AFTER C Python
LINSERT lst BEFORE C Ruby - 11.阻塞
如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据的时候才可以弹出
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务
左右或者头尾阻塞弹出元素BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
从一个列表尾部阻塞弹出元素压入到另一个列表的头部BRPOPLPUSH source destination timeout
第三种:Hash散列的操作
- 1.图解hash散列:
由field和关联的value组成的map键值对
field和value是字符串类型
一个hash中最多包含2^32-1键值对 - 2.设置单个字段
HSET key field value
// key的filed不存在的情况下执行,key不存在直接创建
HSETNX key field value - 3.设置多个字段
HMSET key field value [field value ...]
- 4.返回字段个数
HLEN key
- 5.判断字段是否存在
HEXISTS key field
key或者field不存在,返回0 - 6.返回字段值
HGET key field
- 7.返回多个字段值
HMGET key field [field ...]
- 8.返回所有的键值对
HGETALL key
- 9.返回所有字段名
HKEYS key
- 10.返回所有值
HVALS key
- 11.在字段对应的值上进行整数的增量计算
HINCRBY key field increment
- 12.在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
- 13.删除指定的字段
HDEL key field [field ...]
举例HINCRBY numbers x 100
HINCRBY numbers x -50
HINCRBYFLOAT numbers x 3.14
HDEL numbers x - 14.用途:
节约内存空间
每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算 - 15.不适合hash的情况
使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面
第四种:set集合的操作
无序的、去重的
元素是字符串类型
最多包含2^32-1元素
- 1.增加一个或多个元素
SADD key member [member ...]
如果元素已经存在,则自动忽略
举例SADD friends peter
SADD friends jack tom john
SADD friends may tomSRANDMEMBER key 查看命令
- 2.移除一个或者多个元素
SREM key member [member ...]
元素不存在,自动忽略
举例SREM friends peter
SREM friends tom john - 3.返回集合包含的所有元素
SMEMBERS key
如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用 - 4.检查给定元素是否存在于集合中
SISMEMBER key member
- 5.集合的无序性
SADD friends "peter" "jack" "tom" "john" "may" "ben"
SADD anotherfriends "peter" "jack" "tom" "john" "may" "ben"
SMEMBERS friends
SMEMBERS anotherfriends
注意, SMEMBERS 有可能返回不同的结果,所以,如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表 - 6.随机返回集合中指定个数的
SRANDMEMBER key [count]
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 count>=0
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count < 0 长度为count绝对值,元素可能重复
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素
举例SADD friend "peter" "jack" "tom" "john" "may" "ben"
SRANDMEMBER friends 3
SRANDMEMBER friends -5 - 7.返回集合中元素的个数
SCARD key
键的结果会保存信息,集合长度就记录在里面,所以不需要遍历 - 8.随机从集合中移除并返回这个被移除的元素
SPOP key
- 9.把元素从源集合移动到目标集合
SMOVE source destination member
join的操作 - 1.差集
SDIFF key [key ...],从第一个key的集合中去除其他集合和自己的交集部分
SDIFFSTORE destination key [key ...],将差集结果存储在目标key中
举例SADD number1 123 456 789
SADD number2 123 456 999
SDIFF number1 number2 - 2.交集
SINTER key [key ...],取所有集合交集部分
SINTERSTORE destination key [key ...],将交集结果存储在目标key中
举例SADD number1 123 456 789
SADD number2 123 456 999
SINTER number1 number2 - 3.并集
SUNION key [key ...],取所有集合并集
SUNIONSTORE destination key [key ...],将并集结果存储在目标key中
举例SADD number1 123 456 789
SADD number2 123 456 999
SUNION number1 number2
简单应用:
新浪微博的共同关注
需求:当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户
设计:将每个用户关注的用户放在集合中,求交集即可
实现如下:peter={'john','jack','may'}
ben={'john','jack','tom'}
那么peter和ben的共同关注为:
SINTER peter ben 结果为 {'john','jack'}
第五种:SortedSet有序集合的操作
类似Set集合
有序的、去重的
元素是字符串类型
每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同
最多包含2^32-1元素
- 1.增加一个或多个元素
ZADD key score member [score member ...]
如果元素已经存在,则使用新的score
举例ZADD fruits 3.2 香蕉
ZADD fruits 2.0 西瓜
ZADD fruits 4.0 番石榴 7.0 梨 6.8 芒果 - 2.移除一个或者多个元素
ZREM key member [member ...]
元素不存在,自动忽略
举例ZREM fruits 番石榴 梨 芒果
ZREM fruits 西瓜 - 3.显示分值
ZSCORE key member
举例ZSCORE fruits 芒果
ZSCORE fruits 西瓜 - 4.增加或者减少分值
ZINCRBY key increment member
increment为负数就是减少
举例ZINCRBY fruits 1.5 西瓜
ZINCRBY fruits -0.8 香蕉 - 5.返回元素的排名(索引)
ZRANK key member
举例ZRANK fruits 西瓜
ZRANK fruits 番石榴
ZRANK fruits 芒果 - 6.返回元素的逆序排名
ZREVRANK key member
举例ZREVRANK fruits 西瓜
ZREVRANK fruits 番石榴
ZREVRANK fruits 芒果 - 7.返回指定索引区间元素
ZRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 排列
默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE
举例ZRANGE fruits 0 2
ZRANGE fruits -5 -4 - 8.返回指定索引区间元素[从后开始的 ]
ZREVRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 的 逆序 排列
默认按照score从大到小,如果需要score从小到大排列,使用ZRANGE
举例ZREVRANGE fruits 0 2
ZREVRANGE fruits -5 -4 - 9.返回指定分值区间元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score升序排列,score相同字典序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10、5)
-inf和+inf表示负无穷和正无穷
举例ZRANGEBYSCORE fruits 4.0 7.0
ZRANGEBYSCORE fruits (4 7
ZRANGEBYSCORE fruits -inf +inf - 10.返回指定分值区间元素
ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score降序排列,score相同字典降序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10、5)
-inf和+inf表示负无穷和正无穷
举例ZREVRANGEBYSCORE fruits 7.0 4.0
ZRANGEBYSCORE fruits 7 (4
ZRANGEBYSCORE fruits +inf -inf - 11.移除指定排名范围的元素
ZREMRANGEBYRANK key start stop
举例ZREMRANGEBYRANK fruits 0 2
ZRANGE fruits 0 -1 - 12.移除指定分值范围的元素
ZREMRANGEBYSCORE key min max
举例ZREMRANGEBYSCORE fruits 3.0 5.0
ZRANGE fruits 0 -1 - 13.返回集合中元素个数
ZCARD key
返回指定分值范围中元素的个数ZCOUNT key min max
ZCOUNT fruits 4 7
ZCOUNT fruits (4 7 - 14.并集
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
举例:ZADD scores1 70 tom 80 peter 60 john
ZADD scores2 90 peter 60 ben
ZUNIONSTORE scores-all 2 scores1 scores2
ZUNIONSTORE scores-all1 2 scores1 scores2 AGGREGATE SUM
ZUNIONSTORE scores-all2 2 scores1 scores2 WEIGHTS 1 0.5 AGGREGATE SUM - 15.交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
应用案例: - 1.网易音乐排行榜
分析
每首歌的歌名作为元素(先不考虑重复)
每首歌的播放次数作为分值
ZREVRANGE来获取播放次数最多的歌曲(就是最多播放榜了,云音乐热歌榜,没有竞价,没有权重) - 2.新浪微博翻页
新闻网站、博客、论坛、搜索引擎,页面列表条目多,都需要分页
blog这个key中使用时间戳作为scoreZADD blog 1407000000 '今天天气不错'
ZADD blog 1450000000 '今天我们学习Redis'
ZADD blog 1560000000 '几个Redis使用示例'
ZREVRANGE blog 0 10
ZREVRANGE blog 11 20
以空间换取时间,多层存储,然后折中比较。
第六种:reids的高级命令
exsits key 是否存在某个建
expire key 设置某个key的过期时间,使用ttl查看剩余时间(单位:秒 )
persist key 取消过期时间