简介
Redis 是一个开源的、key-value 结构的、非关系型数据库。它支持存储的 value 类型相对更多,包括 String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合) 和 Hash(哈希),而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。Redis 可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
优势
- 速度快,因为数据存在内存中。
- 支持丰富数据类型,支持 string,list,set,sorted set,hash等。
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
数据操作
连接reidis数据库
通过Redis客户端连接工具可以看到,Redis默认有16个数据库。由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。
通过redis配置文件 redis.conf 也可以看出默认是16个数据库。我们连接redis默认使用的是0号数据库,可以通过命令 select dbid 进行切换,编号是 0 至 databases-1。
key操作
- 列出key
KEYS pattern
- *:通配任意多个字符
- ?::通配单个字符
- []:通配括号内的某1个字符
生产上禁止,更安全的做法是采用scan,操作如下:
因为keys命令会一次性地遍历整个数据库来获取所有与给定模式相匹配的键,所以随着数据库包含的键值对越来越多,这个命令的执行也会越来越慢,而对一个非常大的数据库执行keys命令,将导致服务器阻塞 一段时间。为了解决这个问题,Redis从2.8.0版本开始提供scan命令,这个命令可以以渐进的方式,分多次遍历整个数据库,并返回匹配给定模式的键。scan家族相关命令有scan,sscan,hscan和zscan,命令如下:
# 遍历的是当前数据库的所有key组成的集合
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
# 遍历一个set里的所有元素
SSCAN key cursor [MATCH pattern] [COUNT count]
# 遍历一个哈希表的所有元素,返回的list是key1,field1,key2,field2…的形式
HSCAN key cursor [MATCH pattern] [COUNT count]
# 遍历zset,返回的zset中包含对应的元素和它的分数score
ZSCAN key cursor [MATCH pattern] [COUNT count]
- key:set或hash里面对应的key
- cursor:游标。
- pattern:匹配的模式。
- count:扫描哈希槽的数量,不是f返回的数据量,默认值为 10 。
- type:只能用于scan命令,表示遍历特定类型的集合
- 测试指定key是否存在,返回存在的key的个数
EXISTS [key ...]
- 删除给定key,返回删除的key的个数
DEL [key ...]
- 返回给定key的value类型,none表示不存在key,string字符类型,list链表类型set无序集合类型等
TYPE key
- 随机返回一个key,如果当前数据库是空的,返回空串
RANDOMKEY
- 原子性的重命名一个key
RENAME key newkey
如果newkey存在,将会被覆盖,返回0k表示成功,其他表示失败。失败原因可能是key不存在或者和newkey相同
RENAMENX key newkey
返回1表示成功,0失败,如果newkey存在返回失败
- Key的超时设置
EXPIRE key seconds [NX|XX|GT|LT]
EXPIREAT key unix-time-seconds [NX|XX|GT|LT]
PEXPIRE key milliseconds [NX|XX|GT|LT]
PEXPIREAT key unix-time-milliseconds [NX|XX|GT|LT]
返回1成功,0失败。
- EXPIRE:参数是秒
- EXPIREAT:参数是秒级精度的UNIX时间戳
- PEXPIRE:参数是毫秒
- PEXPIREAT:参数是毫秒级精度的UNIX时间戳
NX:只有key没有设置过期时间时,才能设置过期时间
XX:只有key存在过期时间时,才能设置过期
GT:只有新设置的过期时间比当前的(过期时间)更大,才能设置过期时间
LT:只有新设置的过期时间比当前的(过期时间)更小,才能设置过期时间
TTL key
返回设置过过期时间的key的剩余过期秒数 -1表示没有设置过过期时间,对于不存在的key,返
回-2。
PTTL key
以毫秒返回过期时间。
PERSIST key
消除key超时:返回1成功,0失败。
String操作
- 设置key对应的值
SET key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL
成功返回ok,其中超时参数前面已经解释了,如果key已经存在则覆盖
- NX:只有key不存在时,才能设置
- XX:只有key存在时,才能设置
SETNX key value
仅当key不存在时才set,如果key已经存在,返回0,nx 是not exist的意思
MSET key value [key value ...]
一次设置多个key的值,成功返回ok。如果key已经存在,则覆盖原来的value
MSETNX key value [key value ...
仅当key不存在时才set,只要其中 一个key存在,则全部失败返回0
- 获取key对应的值
GET key
如果key不存在返回nil
GETSET key value
原子的设置key的值,并返回key的旧值。如果key不存在返回nil。应用场景:设置新值,返回
旧值,配合setnx可实现分布式锁。
MGET key [key ...]
一次获取多个key的值,如果对应key不存在,则对应返回nil
- 增减操作
INCR key
对key的值做加加操作,并返回新的值。incr一个不是int的value会返回错误,incr一个不存
在的key,key的值会先被初始化为0 ,然后再执行 INCR 操作,返回为1。
DECR key
同上,incr一个不存在的key,key的值会先被初始化为 0 ,然后再执行DECR操作,返回为-1。
INCRBY key increment
同incr,加指定值 ,key不存在时候会设置key,并认为原来的value是0
DECRBY key decrement
同decr,减指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样
效果,反之一样。
INCRBYFLOAT key increment
为字符串key的值加上浮点数增量,没有对应DECRBYFLOAT,可以给定负值来实现。
- 追加字符串
APPEND key value
返回新字符串值的长度
- 截取字符串
SUBSTR key start end
返回截取过的key的字符串值,并不修改key的值。下标是从0开始的
- 改写字符串
SETRANGE key offset value
用value参数覆写(overwrite)给定key所储存的字符串值,从偏移量offset 开始。 不存在的key
当作空白字符串处理。
- 返回子字符串
GETRANGE key start end
返回key中字符串值的子字符串,字符串的截取范围由start和end两个偏移量决定(包括start和end在内)。可以使用负值,字符串最右边下标是-1。
- 取指定key的value值的长度
STRLEN key
返回key的值得长度,如果key不存在则返回0
- 位操作
SETBIT key offset value
设置key对应的值的二进制offset的值
GETBIT key offset
获取key的值对应位置的二进制
list操作
- 添加元素
LPUSH key element [element ...
RPUSH key element [element ...]
在key对应的list添加字符串元素,L:代表左Push,R:代表右Push,成功返回list的长度,失败返回0。一般从左端Push,右端Pop,即LPush/RPop。
LPUSHX key element [element ...]
RPUSHX key element [element ...]
在key对应的list添加字符串元素,如果key不存在,则不作任何操作。
LINSERT key BEFORE|AFTER pivot element
在key对应list的特定位置之前或之后添加字符串元素
- 查看列表长度
LLEN key
返回key对应list的长度,key对应类型不是list则返回0,key不存在返回错误。
- 查看元素
LINDEX key index
返回名称为key的list中index位置的元素
- 查看一段列表
LRANGE key start stop
返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素 ,key
不存在返回空列表。
- 截取list
LTRIM key start stop
保留指定区间内元素,成功返回1。
- 删除元素
LPOP key [count]
RPOP key [count]
从list的头部删除元素,并返回删除元素。如果key对应list不存在或者key对应值不是lis返回为空。
LREM key count element
从key对应list中删除count个和value相同的元素。count为0时候删除全部,count为正,则删
除匹配count个元素,如果为负数,则是从右侧扫描删除匹配count个元素。
- 设置list中指定下标的元素值
LSET key index element
成功返回1,key或者下标不存在返回错误
- 阻塞队列
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
从头部/尾部删除一个元素,如果list是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。
sets操作
- 添加元素
SADD key member [member ...]
成功返回添加数量,如果元素在集合中返回0
- 移除元素
SREM key member [member ...]
成功返回删除数量,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型
的值返回错误。
- 删除并返回元素
SPOP key [count]
如果set是空或者key不存在返回空
- 随机返回一个元素
SRANDMEMBER key [count]
同spop,随机取set中的一个元素,但是不删除元素。
- 集合间移动元素
SMOVE source destination member
从source对应set中移除member并添加到destination对应set中,整个操作是原子的。成功返回1,
如果member在srckey中不存在返回0,如果key不是set类型返回错误。
- 查看集合大小
SCARD key
如果set是空或者key不存在返回0
- 判断member是否在set中
SISMEMBER key member
存在返回1,0表示不存在或者key不存在。
- 集合交集
SINTER key [key ...]
返回所有给定key的交集
SINTERSTORE destination key [key ...
同SINTER,但是会同时将交集存到destination下
- 集合并集
SUNION key [key ...]
返回所有给定key的并集
SUNIONSTORE destination key [key ...]
同SUNIONSTORE,但是会同时将交集存到destination下
- 集合差集
SDIFF key [key ...]
返回所有给定key的差集
SDIFFSTORE destination key [key ...]
同SDIFF,但是会同时将交集存到destination下
- 获取所有元素
SMEMBERS key
返回key对应set的所有元素,结果是无序的,生产上禁止,可以使用使用SSCAN
sorted sets操作
- 添加元素
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
- XX:仅更新已存在的member
- NX:仅新增member,这个member是原先不存在的
- LT:仅更新存在并且新的score小于原来的score的member
- GT: 仅更新存在并且新的score大于原来的score的member。
- CH:表示返回值是返回被修改的数量(包括:新增和更新)。默认是仅返回新增的数量
- INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
有序集合按照分数以递增的方式进行排序。相同的成员(member)只存在一次,有序集合不允许存在重复的成员。当多个成员有相同的分数时,他们将是有序的字典(ordered lexicographically)(仍由分数作为第一排序条件,然后,相同分数的成员按照字典规则相对排序)。字典顺序排序用的是二进制,它比较的是字符串的字节数组。
- 删除元素
ZREM key member [member ...]
1表示成功,如果元素不存在返回0
ZREMRANGEBYLEX key min max
删除有序集合中给定的字典区间的所有成员
ZREMRANGEBYSCORE key min max
删除集合中score在给定区间的元素
- 增加score
ZINCRBY key increment member
增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的score值,
可以为负数递减
- 获取指定member的排名
ZRANK key member
返回指定元素在集合中的排名(下标,注意不是分数),集合中元素是按score从小到大排序的
- 获取元素
ZRANGE key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
类似lrange操作从集合中去指定区间的元素。返回的是有序结果
ZREVRANGE key start stop [WITHSCORES]
同上,返回结果是按score逆序的,如果需要得分则加上withscores
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回给定分数区间的元素
ZCOUNT key min max
返回集合中score在给定区间的数量
- 返回集合中元素个数
ZCARD key
- 返回给定元素对应的score
ZSCORE key member
hash操作
- 设置hash值
HSET key field value [field value ...]
将哈希表key的域field的值设置为value,返回值为新创建的field域的个数,对于已经存在的域进行了value的覆写,是不计算在返回值中的。
- 获取hash值
HGET key field
获取指定的hash field
HMGET key field [field ...]
获取全部指定的hash filed
HMSET key field value [field value ...]
同时设置hash的多个field
- 递增某一个域的值
HINCRBY key field increment
将指定的hash filed 加上给定值, 如果filed不是integer则报错
- 判断某一个域是否存在
HEXISTS key field
测试指定field是否存在
- 删除域
HDEL key field [field ...]
删除指定的hash field
- 获取域的数量
HLEN key
返回指定hash的field数量
- 获取所有的域名
HKEYS key
返回hash的所有field
- 获取所有域的值
HVALS key
返回hash的所有value
- 获取所有域名和值
HGETALL key