redis多数据库
1. redis 是一个字典结构的存储服务器,redis提供了多个存储数据的字典。这里所说的字典其实就是一个个数据库。
2. redis 提供了16个数据库,每个数据库对应一个从0开始递增的数数字。
3. 客户端与redis服务端建立连接时默认选择0号数据库。
4. 通过SELECT 命令来更换数据库。
命令介绍:
KEYS * | 查看当前数据库中的所有的key |
SELECT 数据库编号【0-15】 | 选择数据库 |
FLUSHALL | 清空一个redis所有数据库中的数据 |
入门
热身
判断一个键是否存在
EXISTS key
删除键
DEL key [key ...]
删除一个或多个,返回删除的个数
获取键的类型
TYPE key
字符串类型
赋值与取值
SET key value
GET key
当key 不存在时,返回空结果
一个字符串类型允许存储的数据最大容量为 512MB
递增数字
INCR key
当操作的键不存在时,默认值未为0,所以第一次递增后值为1
当同一时间多个客户端访问num,会出现竞争导致不安全状况,但是INCR 避免了这个问题
实践
1. 文章访问量的统计
使用INCR
2. 生成自增ID
使用INCR,加入一条记录,INCR一次
3. 存储文章数据
将文章的标题,内容等序列化后,存入到String 类型的值中,取出来进行反序列化获取文章。
增加指定的整数
INCRBY key increment
减少指定的整数
DECR key
DECRBY key decrement
增加指定浮点数
INCRBYFLOAT key increment
向尾部追加值
APPEND key value
获取字符串的长度
STRLEN key
同时获取/设置多个值
MGET key [key ...]
MSET key value [key value ...]
散列类型
一个散列类型的键可以包含 (2^32) -1 个字段,字段值只能是字符串
赋值与取值
HSET key field value
HGET key field
HMSET key field value [field value ..]
HGET key field [field ...]
HGETALL key
同时 设置/获取 多个字段值
获取键中所有的字段和值
判断字段是否存在
HEXISTS key field
存在返回 1,否则返回 0
当字段不存在时赋值
HSETNX key field value
HSETNX 与 HSET 命令类似,区别在于如果字段已经存在,HSETNX 命令将不会执行任何操作。
HSETNX 是原子操作,不用担心竞争条件
增加数字
HINCREBY key field increment
删除字段
HDEL key field [field ...]
删除一个或多个字段,返回被删除字段的个数
只获取字段名或字段值
HKEYS key
HVALS key
获取字段的数量
HLEN key
实践
1. 存储文章数据
列表类型
缺点:通过索引查找某个位置的元素,需要一个个查询知道找到该索引元素 O(n)
向列表两端增加元素
LPUSH key value [value ...]
RPUSH ley value [value ...]
顺序为:3 2 1
从列表两端弹出元素
LPOP key
RPOP key
LPOP 第一步将列表左边第一个元素从列表中删除,第二步返回被删除的元素
获取列表中元素的个数
LLEN key
当key不存在时,返回0
获取列表片段
LRANGE key start stop
start 开始索引
stop 结束索引(包含)-1 表示右边第一个元素, -2 表示右边第二个元素
获取所有元素
删除列表中指定的值
LROM key count value
获得/设置指定索引的元素
LINDEX key index
LSET key index value
只保留列表指定片段
LTRIM key start end
删除指定范围为的所有元素
向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
pivot 从左到右查找值为pivot 的值
将元素 从一个列表转移到另一个列表
RPOPLUSH source destination
集合
相当于Java中的set集合,无序且唯一。
增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
如果需要加入的元素已经存在与集合中就忽略这个元素。本命令返回值为成功加入 的个数
获取集合中的所有元素
SMEMBERS key
判断元素是否在集合中
SISMEMBERS key member
时间复杂度为O(1)
集合间运算
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
(1) SDIFF 计算集合间的差集
属于A且不属于B
先计算集合A与集合B的差集,再计算结果与集合C的差集
(2) SINTER 用来对多个集合进行求交集
(3) SINTER 表示多个集合间的并集,属于A或属于B的元素构成的集合
获取集合中元素的个数
SCARD key
进行结合运算并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
将结果存到 destination 集合中
将 setA 与 setB 的交集存储到 setD 中
随机获取集合中的元素
SRANDMEMBER key [count]
从集合中弹出一个元素
SPOP key
有序集合类型
有序集合与列表的区别
增加元素
ZADD key score member [score member ...]
score 表示表示分数,用来排序
修改Tom的分数
分数不仅可以是整数,也可以是浮点数
+inf 表示 正无穷
-inf 表示 负无穷
获取元素的分数
ZSCORE key member
获取排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE 按照从小到大的顺序排序,WITHSCORES 带上分数
ZREVRANGE 按照从大到小
如果分数相同,会按照member 进行排序
获取指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
(100 不包含100
增加某个元素的分数
ZINCRBY key increment member
获取集合中元素的个数
ZCARD key
获取指定分数范围的元素个数
ZCOUNT key min max
删除一个或者多个元素
ZREM key member [member ...]
按照排名范围删除元素
ZREMRANGEBYRANK key start stop
按照分数范围删除元素
ZREMRANGEBYSCORE key min max
获取元素的排名
ZRANk key member
ZREVRANK key member
进阶
事务
同一个事务,要么全执行,要么全不执行。
MULTI
要执行的命令
EXEC
MULTI 开启事务,EXEC 提交事务,redis 中没有回滚
错误处理
- 语法错误
正确的命令,加入到事务队列,如果有命令语法错误,redis 会直接返回错误,正确的命令也不会执行
- 运行错误
如果事务中一条命令出现了运行错误,事务里其他命令依然 可以继续执行(包括错误命令之后的命令)
WATCH
可以监控一个或多个键,一旦其中有一个被修改或删除,之后的事务不会执行。监控一直持续到EXEC命令。
过期时间
设置过期时间
EXPIRE key seconds
seconds 表示过期时间,单位s
设置成功返回1
查看还有多长时间过期
TTL key
取消过期时间的设置(恢复为永久)
PERSIST key
应用
- 实现访问频率限制(1)
- 实现访问频率限制(2)
- 实现缓存
当过去时间太长,且大量使用缓存后,会导致Redis内存占满。
(字节)
当超出了设置的内存,Redis会根据maxmemory策略指定参数来删除不需要的键
排序
SORT 命令
对有序集合排序会忽略元素的分数
按照字典顺序排序
SORT key ALPHA
从大到小排序
SORT key DESC
BY 参数
post:*->time 通过集合的time字段排序
itemscore:* 通过字符串的键排序
anytext 是常量键名进行排序(不存在的)
GET
STORE 参数
性能优化