redis常用数据类型及操作

在之前的文章介绍了redis的安装,本篇一起来看看怎么用python来操作redis,并对redis支持的常用数据结构进行进一步的认识

python redis库

官方文档

安装

pip3 install redis

基本使用

import redis

db = redis.Redis('10.15.45.60')  # 默认本地6379的0号库
print(db.keys('*'))  # 查看所有匹配keys

db.set('test', 0b01100010)  # 0x62
print(db.get('test'))

db.set(0b11, 0x63)

print(db.get(0b11))
print(db.get(3))
print(db.get('3'))

print(db.keys('*'))  # 查看所有匹配keys

常用数据结构

redis key

  • 键值key需要一个二进制值,可以用任何二进制序列作为key值,可以是简单字符串,也可以是个JPEG文件的二进制序列。空字符串也是有效key值
  • 键值不需要太长,消耗内存,而且查找这类键值的计算成本较高,键值不宜过短,可读性较差

命令

  • 帮助命令
127.0.0.1:6379 > Help 查看帮助
127.0.0.1:6379 > Help <tab> 使用tab键切换帮助
127.0.0.1:6379 > Help set 查看set命令帮助
127.0.0.1:6379 > Help @string 查看命令组帮助
  • 库操作
$ redis-cli --help
$ redis-cli -n 2  # 登陆不同的库
127.0.0.1:6379 > SELECT n   # 选择不同库
$ FLUSHDB   # 清除当前库数据
$ FLUSHALL  # 清除所有库中的数据

用python操作redis与命令行基本一致,直接redis.Redis类实例的函数调用即可,这里不在举例

class Redis(object):
    def __init__(self, host='localhost', port=6379,
                 db=0, password=None, socket_timeout=None,
                 socket_connect_timeout=None,
                 socket_keepalive=None, socket_keepalive_options=None,
                 connection_pool=None, unix_socket_path=None,
                 encoding='utf-8', encoding_errors='strict',
                 charset=None, errors=None,
                 decode_responses=False, retry_on_timeout=False,
                 ssl=False, ssl_keyfile=None, ssl_certfile=None,
                 ssl_cert_reqs='required', ssl_ca_certs=None,
                 ssl_check_hostname=False,
                 max_connections=None, single_connection_client=False,
                 health_check_interval=0, client_name=None, username=None):
......

字符串

字符串设置

SET key value [EX seconds][PX milliseconds] [NX|XX] 设置字符串值

  • EX 设置过期时间,秒,等同于 SETEX key seconds value
  • PX 设置过期时间,毫秒,等同于 PSETEX key milliseconds value
  • NX 键不存在,才能设置,等同于 SETNX key value
  • XX 键存在时,才能设置
    MSET key value [key value ...] 设置多个键的字符串值
  • key存在则覆盖,key不存在则增加
    MSETNX key value [key value ...] 设置多个键的字符串值
  • key不存在则设置,key存在则设置失败。nx指不存在
  • 该命令是原子操作

过期操作与生存时间

EXPIRE key secondsPEXPIRE key milliseconds 设置多少秒或者毫秒后过期
EXPIREAT key timestampPEXPIREAT key milliseconds-timestamp 设置在指定Unix时间戳过期
PERSIST key 持久key,即取消过期
TTL keyPTTL key

  • key存在但没有设置TTL,返回-1
  • key存在,但还在生存期内,返回剩余的秒或者毫秒
  • key曾经存在,但已经消亡,返回-2(redis 2.8版本之前返回-1)

key操作

keys pattern

  • *任意长度字符; ?任意一个字符;[] 字符集合,表示一个字符
    TYPE key key类型
    EXISTS key key是否存在
    RENAME key newkeyRENAMENX key newkey 键重命名
    DEL key [key ...] 键删除

字符串获取

GET key 获取值
MGET key [key ...] 获取多个给定的键的值
GETSET key value 返回旧值并设置新值,如果键不存在,就创建并赋值
STRLEN key 字符串长度

字符串操作

APPEND key value 追加字符串

  • 如果键存在就追加;如果不存在就等同于SET key value
    GETRANGE key start end 索引值从0开始,支持负索引,-1表示最后一个字符。范围是[start, end],start必须在end的左边,否则返回空串
    SETRANGE key offset value 从指定索引处开始覆盖字符串,返回覆盖后字符串长度。key不存在会创建新的

自增和自减

INCR keyDECR key 步长1的增减
INCRBY key decrementDECRBY key decrement 步长增减

位图bitmap

位图不是真正的数据类型,它是定义在字符串类型上,只不过把字符串按位操作

SETBIT key offset value 设置某一位上的值

  • offset偏移量,从0开始
  • value不写,默认是0
    GETBIT key offset 获取某一位上的值
    BITPOS key bit [start][end] 返回指定值0或者1在指定区间上第一次出现的位置
    BITCOUNT key [start][end] 统计指定位区间上值为1的个数
  • 从左向右从0开始,从右向左从-1开始

位操作

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上

  • operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
    BITOP AND destkey key [key ...],对一个或多个 key 求位与,并将结果保存到 destkey
    BITOP OR destkey key [key ...],对一个或多个 key 求位或,并将结果保存到 destkey
    BITOP XOR destkey key [key ...] ,对一个或多个 key 求位异或,并将结果保存到 destkey
    BITOP NOT destkey key,对给定 key 求逻辑非,并将结果保存到 destkey,除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入

list列表

  • 列表是基于双向链表实现,列表头尾增删快,中间增删慢
  • 元素是字符串类型,元素可以重复出现
  • 索引支持正索引和负索引,从左至右从0开始,从右至左从-1开始

LLEN key 返回列表元素个数
LPUSH key value [value ...] 从左边向队列中压入元素
LPUSHX key value 从左边向队列加入元素,要求key必须存在
RPUSH key value [value ...] 从右边向队列中压入数据
RPUSHX key value 要求key存在
LPOP key 从左边弹出列表中一个元素
RPOP key 从右边弹出列表中一个元素
RPOPLPUSH source destination 从源列表中右边pop一个元素,从左边加入到目标列表
LRANGE key start stop 返回列表中指定访问的元素,例如LRANGE user 0 -1
LINDEX key index 返回列表中指定索引的元素
LSET key index value 设置列表中指定索引位置的元素值,index不能超界

B:Block阻塞;L:Left 左起,或指列表;R:Right 右起;X:exist 存在

LREM key count value从左边删除列表中与value相等的元素

  • count > 0 从左至右搜索,移除与 value 相等的元素,数量至多为 count 次

  • count < 0 从右至左搜索,移除与 value 相等的元素,数量至多为 -count次

  • count = 0 移除列表中所有value值
    LTRIM key start stop 去除指定范围外的元素
    LINSERT key BEFORE|AFTER lst_val value 在列表中某个存在的值(lst_val)前或后插入元素一次,key或不存在,不进行任何操作

  • 阻塞

    • 如果弹出的列表不存在或者为空,就会阻塞
    • 如果多个客户端阻塞在同一个列表上,则先到先服务原则
      BLPOP key [key ...] timeout 列表左边阻塞弹出元素。timeout是超时秒数,为0为永久阻塞。
      BRPOP key [key ...] timeout 列表右边阻塞弹出元素
      BRPOPLPUSH source destination timeout 从一个列表尾部阻塞弹出元素压入到另一个列表的头部

hash散列

值是由field和value组成的map键值对,field和value都是字符串类型
HSET key field value 设置单个字段。field不存在创建,存在覆盖value
HSETNX key field value 设置单个字段,要求field不存在。如果key不存在,相当于field也不存在
HMSET key field value [field value ...] 设置多个字段
HLEN key 返回字段个数
HEXISTS key field 判断字段是否存在。key或者field不存在,返回0
HGET key field 返回字段值
HMGET key field [field ...] 返回多个字段值
HGETALL key 返回所有的键值对
HKEYS key 返回所有字段名
HVALS key 返回所有值
HINCRBY key field increment 在字段对应的值上进行整数的增量计算
HINCRBYFLOAT key field increment在字段对应的值上进行浮点数的增量计算
HDEL key field [field ...] 删除指定的字段

set集合

集合的元素是无序的、去重的,元素是字符串类型
SADD key member [member ...]增加一个或多个元素,元素已存在将忽略
SREM key member [member ...] 移除一个或多个元素,元素不存在自动忽略
SCARD key 返回集合中元素的个数。不需要遍历。
SMEMBERS key 返回集合中的所有元素。注意,如果集合中元素过多,应当避免使用该方法
SISMEMBER key member 元素是否是在集合中
SRANDMEMBER key [count]随机返回集合中指定个数的元素

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值
  • 如果 count 为 0,返回空
  • 如果 count 不指定,随机返回一个元素
    SPOP key 从集合中随机移除一个元素并返回该元素
    SMOVE source destination member 把元素从源集合移动到目标集合
  • 差集
    SDIFF key [key ...] 从第一个key的集合中去除其他集合和自己的交集部分
    SDIFFSTORE destination key [key ...] 将差集结果存储在目标key中
  • 交集
    SINTER key [key ...] 取所有集合交集部分
    SINTERSTORE destination key [key ...] 将交集结果存储在目标key中
  • 并集
    SUNION key [key ...] 取所有集合并集
    SUNIONSTORE destination key [key ...] 将并集结果存储在目标key中

sortedset有序集合

类似Set集合,有序的集合
ZADD key score member [score member ...] 增加一个或多个元素。如果元素已经存在,则使用新的score
ZCARD key 返回集合的元素个数
ZCOUNT key min max 返回指定score范围元素的个数
ZSCORE key member 显示分值
ZINCRBY key increment member 增加或减少分值。increment为负数就是减少
ZRANGE key start stop [WITHSCORES] 返回指定索引区间元素

  • 如果score相同,则按照字典序lexicographical order 排列
  • 默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE
    ZREVRANGE key start stop [WITHSCORES]返回指定索引区间元素
  • 如果score相同,则按照字典序lexicographical order 的 逆序 排列
  • 默认按照score从大到小,如果需要score从小到大排列,使用ZRANGE
    ZRANK key member 返回元素的排名(索引)
    ZREVRANK key member 返回元素的逆序排名(索引)
    ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count] 返回指定分数区间的元素
    ZREVRANGEBYSCORE key max min [WITHSCORES][LIMIT offset count] 降序返回指定分数区间的元素
    ZREM key member [member ...] 移除一个或多个元素。元素不存在,自动忽略
    ZREMRANGEBYRANK key start stop 移除指定排名范围的元素
    ZREMRANGEBYSCORE key min max 移除指定分值范围的元素
  • 并集
    ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • 交集
    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

更多

更多常用操作请参考redis官方文档