Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事。一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化。

数据类型和对应命令

所有存储于redis中的数据都对应于一个键值对(key-value pair), key可以是任意二进制序列,通常我们使用字符串来标记一个特定的key。在redis中我们通常称这个key为name或者就叫key, 而对于value,redis支持如下几种类型:

  • strings
  • lists: list内容只能是string
  • sets: set中存储非重复的string
  • sorted sets: 与sets类似,但是每个string都会对应一个float类型的score,从而用于排序
  • hashes: 键值对hash类型,也就是Python中的dict,注意在redis中最外层的key一般叫做name或者key,而value中数据类型如果是dict,那么这个dict中的key通常被称为field。
  • Bit arrays (or simply bitmaps): 实际存储的仍然是string,但是可以针对bit进行操作
  • HyperLogLogs: 用于估计unique value的数量

针对不同的数据类型,会有不同的命令,通过如下脑图可以更加清晰地记忆redis的命令

 
Redis数据类型与常用命令

strings

127.0.0.1:6379> set strtest xyz
OK
127.0.0.1:6379> get strtest
"xyz"
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
# 注意以下增减操作只能针对整数数字(虽然类型仍然是string类型)
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> incrby b 5
(integer) 7
127.0.0.1:6379> decr b
(integer) 6
127.0.0.1:6379> decrby b 3
(integer) 3

lists

lists类型中存储的仍然是string类型

# left push用于从左将item压入到list当中
127.0.0.1:6379> lpush list_test 1 2 3
(integer) 3 # 注意如果想看list中的内容,无法通过get直接去看,get只是针对string,而必须使用lrange
127.0.0.1:6379> get list_test
(error) WRONGTYPE Operation against a key holding the wrong kind of value # 这里0 -1均为list index,表示从index 0 开始到-1结束,-1即从右数最后一个item
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1" 127.0.0.1:6379> rpush list_test 5 7
(integer) 5
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1"
4) "5"
5) "7"
127.0.0.1:6379> lpop list_test
"3"
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"
4) "7" # 从左trim截断list,以下是截取index 0 到index 2 的item作为新的list
127.0.0.1:6379> ltrim list_test 0 2
OK
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"

hashes (dict)

哈希类型,在python中也就是dict类型。这也是非常常用的数据类型。

127.0.0.1:6379> hset htest a 1
(integer) 1
127.0.0.1:6379> hget htest a
"1"
127.0.0.1:6379> hmset htest a 1 b 2 c 3
OK
127.0.0.1:6379> hmget htest a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> hgetall htest
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
127.0.0.1:6379> hkeys htest
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> hvals htest
1) "1"
2) "2"
3) "3"

在python程序中使用redis-py driver的时候,通过dict进行操作会非常清晰和简单。

In [1]: import redis

In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0)

In [3]: d = {"a": 2, "b": 3}

In [4]: key = "test:2"

In [5]: r.hmset(key, d)
Out[5]: True In [6]: r.hgetall(key)
Out[6]: {'a': '2', 'b': '3'}

sets

127.0.0.1:6379> sadd set_test a b 33
(integer) 3
127.0.0.1:6379> sadd set_test c a b 22
(integer) 1 # 可以看到不会有重复的item
127.0.0.1:6379> smembers set_test
1) "c"
2) "33"
3) "a"
4) "b" # 用于测试set中是否包含指定的item,如有则返回1,没有返回0
127.0.0.1:6379> sismember set_test a
(integer) 1
127.0.0.1:6379> sismember set_test xx
(integer) 0 127.0.0.1:6379> sadd set_test2 a b 56 66
(integer) 4
127.0.0.1:6379> smembers set_test2
1) "56"
2) "a"
3) "66"
4) "b" # 求交集
127.0.0.1:6379> sinter set_test set_test2
1) "a"
2) "b" # 求并集
127.0.0.1:6379> sunion set_test set_test2
1) "33"
2) "a"
3) "56"
4) "c"
5) "66"
6) "22"
7) "b"

sorted sets

sorted sets与sets类似,可以保证item不重复,区别在于sorted sets中每个item对应一个float类型的score

127.0.0.1:6379> zadd sort_set 2.2 a
(integer) 1
127.0.0.1:6379> zadd sort_set 2 bb
(integer) 1
127.0.0.1:6379> zadd sort_set 10 x
(integer) 1 # 获取index 从0 到-1的(即所有) items
127.0.0.1:6379> zrange sort_set 0 -1
1) "bb"
2) "a"
3) "x" # 获取item bb对应的index
127.0.0.1:6379> zrank sort_set bb
(integer) 0
127.0.0.1:6379> zrank sort_set x
(integer) 2
127.0.0.1:6379> zscore sort_set x
"10" # 用于获取对应score set中item的数量
127.0.0.1:6379> zcard sort_set
(integer) 3

bit arrays

用于针对指定的key设置位数据为0 或 1。当我们对存储有较高要求,且对于统计为1的item的数量时,使用bit array是一个好的办法。

# 针对bit 7进行设置,设置为1,返回该位之前存储的值
127.0.0.1:6379> setbit bit_test 7 1
(integer) 0
127.0.0.1:6379> setbit bit_test 7 0
(integer) 1
127.0.0.1:6379> get bit_test
"\x00"
127.0.0.1:6379> setbit bit_test 8 1
(integer) 0
127.0.0.1:6379> setbit bit_test 9 1
(integer) 0 # 统计有多少位为1
127.0.0.1:6379> bitcount bit_test
(integer) 2

HyperLogLogs

redis实现了相应算法可以估计hyperloglog中存储的所有item中非重复的item的数量

127.0.0.1:6379> pfadd loglog 1 3 5 7 1
(integer) 1
127.0.0.1:6379> pfcount loglog
(integer) 4

通用的命令

  • keys pattern: pattern可以为glob风格的通配符格式,最常用的是keys *查询所有的keys
  • exists key: 查询该key是否存在
  • del key: 删除该key对应的数据
  • type key: 查询该key对应的value的数据类型
  • expire key: 定义多长时间后key对应的数据过期,过期后数据会被自动删除
  • ttl key: 查询该key对应的剩余存活时间
  • flushdb/flushall: flushdb用于清除当前db的所有数据,flushall清除所有数据库的数据

References

作者:geekpy
链接:https://www.jianshu.com/p/cd434a19c822
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Redis数据类型和常用命令的更多相关文章

  1. redis数据类型及常用命令介绍(图文实例)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhgAAAFLCAYAAACUdvXUAAAgAElEQVR4nO3da1da58L2fT5KfPvc96 ...

  2. redis笔记总结之redis数据类型及常用命令

    三.常用命令 3.1 字符串类型(string) 字符串类型是Redis中最基本的数据类型,一个字符串类型的键允许存储的数据的最大容量为512MB. 3.1.1 赋值与取值: SET key valu ...

  3. redis数据类型及常用命令使用

    redis干啥的,一般人都知道,但很多人只知道是个缓存数据库,其它的就不知道了,本猿无能亦是如此,然知耻而后勇,我们该理一理这里边的一些逻辑,看看redis究竟是怎么一回事儿,能干啥,怎么做的,这样才 ...

  4. redis 介绍和常用命令

    redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...

  5. 记录redis安装及常用命令

    Redis安装及常用命令 一.安装 1.下载,解压,进入redis解压目录,make. make PREFIX=目录/redis install :安装到指定目录文件名为redis. 2.将解压目录里 ...

  6. redis五种数据类型和常用命令及适用场景

    一.redis的5种数据类型: 1.基础理解: string 字符串(可以为整形.浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) h ...

  7. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

  8. VMWare12安装CentOS7以及redis安装和常用命令

    一.vmware安装centos7后没有网卡 VMWare 12版本不提供32位安装程序,只有64位安装程序,如果在安装CentOS时,选择的是CentOS而不是CentOS 64位,则会出现Cent ...

  9. 数据库之redis篇(2)—— redis配置文件,常用命令,性能测试工具

    redis配置 如果你是找网上的其他教程来完成以上操作的话,相信你见过有的启动命令是这样的: 启动命令带了这个参数:redis.windows.conf,由于我测试环境是windows平台,所以是这个 ...

随机推荐

  1. 4556: [Tjoi2016&Heoi2016]字符串

    4556: [Tjoi2016&Heoi2016]字符串 链接 分析: 首先可以二分这个长度.此时需要判断是否存在一个以b结尾的前缀,满足与[c,d]的lcp大于等于mid. 如果我们把串翻转 ...

  2. 自定义CCNode

    对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类. 自定义Touch事件处理类重要 ...

  3. SpringBoot入门学习记录(一)

    最近,SpringBoot.SpringCloud.Dubbo等框架非常流行,作为Coder里的一名小学生,借着改革开放的东风,自然也是需要学习学习的,于是将学习经历记录于此,以备日后查看. 官网:h ...

  4. 查看Python的版本、内建方法和模块等内容的方法

    若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...

  5. dtcp格式定义

    common name type optional comment id string y Content id version string y DTCP version. "1.0&qu ...

  6. PAT甲题题解-1119. Pre- and Post-order Traversals (30)-(根据前序、后序求中序)

    (先说一句,题目还不错,很值得动手思考并且去实现.) 题意:根据前序遍历和后序遍历建树,输出中序遍历序列,序列可能不唯一,输出其中一个即可. 已知前序遍历和后序遍历序列,是无法确定一棵二叉树的,原因在 ...

  7. Notes of Daily Scrum Meeting(12.8)

    今日团队任务总结: 团队成员 今日团队工作 陈少杰 使用例子对json数据进行解析 王迪 确定搜索功能的接口 金鑫 对布局文件进行协助修改 雷元勇 开始进行搜索功能的代码实现 高孟烨 按照学长的样本对 ...

  8. 第二次spring冲刺第2天

    今天我们开了个小会,关于讨论开始页面的设计及数据输入的格式限制.运算功能等改善

  9. UART协议总结

    之前一直使用UART作为单片机之间以及和计算机的简单通信,但一直没有研究过该协议的内部原理.今天刚买了一个逻辑分析仪,于是使用该分析仪对UART数据进行分析,以便更好的理解UART协议原理. UART ...

  10. 动态规划刷题集python代码

    1 爬楼梯(Fibonacci) #有一楼梯共M级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? def fun(m): c = [0]*m c[0] = 1 c[1] = 2 for i ...