Redis-1.Redis数据结构

安装直接用brew搞定,现在还没有遇到问题,有问题再删这句话。😂

1.Redis中的数据结构

Redis中有五种数据结构:

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串,整数,浮点数 对整个字符串或者字符串中的一部分执行操作;
对整数和浮点数执行自增减操作。
LIST 链表,每个节点都包含了一个STRING 从链表两端推入或者弹出元素;
根据偏移量对链表进行裁剪(trim);
读取单个或多个元素;
根据值查找或者移除元素
SET 包含STRING的无需收集器(unordered collection),并且被包含的每个STRING都是唯一的 添加,获取,移除单个元素;
检查一个元素是否存在;
计算交集、并集、差集;
从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET 字符串成员(member)与浮点数分值(score)之间的有序映射,元属的排列顺序由分值大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

2. 字符串

Redis是一个字节组成的序列,可以存储三种类型的值:

  • 字符串(byte string)
  • 整数(和系统长整型范围相同)
  • 浮点数(IEEE 754标准浮点数,double)

常用命令:

命令 用例——描述
GET get key ——获取键的值
SET set key value——设置键的值
DEL del key——删除键的值

例子:

pengjunzhe: ~$redis-cli
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)

自增自减命令
自增自减命令只能作用于整数,如果对不存在的键或者保存了空串的键执行自增/自减操作,那么会将这个键的值当作0处理,如果对无法解释为整数或者浮点数的字符串值性自增/自减操作,把额会返回一个错误。

命令 用例和描述
INCR INCR key——将键存储的值加1
DECR DECR key——将键存储的值减1
INCRBY INCRBY key amount——将键存储的值加上整数amount
DECRBY DECRBY key amount——将键存储的值减去整数amount
INCRBYFLOAT INCRBYFLOAT key amount——将键存储的值加上浮点数amount

例子(python):

import redis
conn = redis.Redis()
conn.get('key')
conn.incr('key')
1
conn .incr('key', 15)
16
conn.decr('key',5)
11
conn.set('key', '13')
True
conn.incr('key')
14

子串和二进制位命令

命令 用例和描述
APPEND APPEND key value——将value追加到给定键当前存储值的末尾
GETRANGE GETRANGE key start end——获取一个由偏移量start至偏移量end范围内所有字符组成的子串,包括start和end
SETRANGE SETRANGE key offset value——将start偏移量开始的子串设置为给定制
GETBIT GETBIT key offset——将字符串看作是二进制位串(bit string)并返回串中偏移量为offset的二进制位的值
SETBIT SETBIT key offset value——将字节串看作是二进制串,并将位串中偏移量为offset的值设置为value
BITCOUNT BITCOUNT key [start end]——统计二进制位串中值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计
BITOP BITOP operation dest-key key-name对一个或多个二进制串值性包括并(AND),或(OR),异或(XOR),非(NOT)在内的任何一个位运算操作。并将计算出来的结果保存在dest-key键里面

例子:

conn = redis.Redis()
conn.append("new-string-key", "hello ")
6
conn.append("new-string-key", "world!")
12
conn.substr("new-string-key", 3, 7)
b'lo wo'
conn.setrange("new-string-key", 0, "H")
12
conn.get("new-string-key")
b'Hello world!'
conn.setrange('new-string-key', 11, ' how re you?')
23
conn.get('new-string-key')
b'Hello world how re you?'
conn.setbit('another-key', 2, 1)
0
conn.setbit('another-key', 7, 1)
0
conn.get('another-key')
b'!'

3. 列表(list)简介

Redis的一个列表可以有序的存储多个字符串。
列表命令:

命令 行为
LPUSH 将给定的值推入列表的左端
RPUSH 将给定的值推入列表的右端
LPOP 从列表的左侧弹出一个元素,并范围被弹出的值
RPOP 从列表的右侧弹出一个元素,并范围被弹出的值
LRANGE 获取列表在给定范围上的所有值
LINDEX 获取列表在给定位置上的单个元素
LTRIM 对列表进行修剪,只保留start偏移量到 end偏移量范围内的元素,其中偏移量为start和end的元素会被保留

例子:

127.0.0.1:6379> rpush list-key item
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lindex list-key 1
"item2"
127.0.0.1:6379> lpop list-key
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"

阻塞式的在列表单出命令以及在列表之间移动元素的命令

命令 描述
BLPOP blpop key-name timeout:在从第一个非空列表中单出位于最左端的元素,或者在timeout秒内阻塞并等待可弹出的元素出现
BRPOP brpop key-name timeout:在从第一个非空列表中单出位于最右端的元素,或者在timeout秒内阻塞并等待可弹出的元素出现
RPOPLPUSH rpoplpush source-key dest-key:从source-key列表中弹出最右端的元素,然后吧这个元素推入dest-key列表的最左端,并向用户返回这个元素
BRPOPLPUSH brpoplpush source-key dest-key timeout:从source-key列表中弹出最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果使用source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现

4. 集合简介

集合也可以存储多个字符串,但是集合通过使用散列表来保证存储的字符串是个不相同的。

集合常用命令:

命令 行为
SADD sadd key-name item:将一个或多个元素添加到集合中,并返回添加元素中原本不存在于集合里面的元素数量
SREM srem key-name item:从集合里面移除一个或多个元素,并返回被移除的元素的数量
SISMEMBER sismember key-name item:检查元素item是否存在于集合中
SMEMBERS 获取集合的包含的所有元素
SRANDMEMBER srandmember key-name [count]:从集合里面随机随机返回一个或者多个元素,当count为正数时,命令返回的随机元素不会重复,当count为负数时,命令返回的随机元素可能会出现重复
SPOP spop key-name:随机的移除集合中的元素,并返回被移除的元素
SMOVE SMOVE source-key dest-key item:如果集合source-key包函元素item,则从集合source-key中移除元素item,并将元素item添加到集合dest-key中,如果item被成功移除,那么返回1,否则返回0

例子:

127.0.0.1:6379> sadd set-key item
(integer) 1
127.0.0.1:6379> sadd set-key item1
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item"
2) "item1"
3) "item2"
127.0.0.1:6379> sismember set-key item3
(integer) 0
127.0.0.1:6379> srem set-key item2
(integer) 1
127.0.0.1:6379> srem set-key item2
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item"
2) "item3"

组合和处理多个集合的Redis命令

命令 描述
SDIFF sdiff key-name [key-name ...]:返回存在于一个集合,但是不存在于其他集合中的元素(差集运算)
SDIFFSTORE sdiffstore dest-key key-name [key-name ... ]:将存在于一个集合但是并不存在于其他集合中的元素存储到dest-key中
SINTER sinter key-name [key-name ... ]:返回同时存在于所有集合的元素(交集运算)
SINTERSTORE sinterstore dest-key key-name [ key-name ... ]:将那些同时存在于所有集合的元素存储到dest-key里面
SUNION sunion key-name [key-name ... ]:返回那些存在于至少一个集合的元素(并集运算)
SUNIONSTORE sunionsotre dest-key keyname [key-name ... ]将那些至少存在于一个集合的元素存储到dest-key键里面

例子:

conn.sadd('skey', 'a', 'b', 'c', 'd')
4
conn.sadd('skey2', 'c', 'd', 'e', 'f')
4
conn.sdiff('skey', 'skey2')
{b'b', b'a'}
conn.sinter('skey', 'skey2')
{b'd', b'c'}
conn.sunion('skey', 'skey2')
{b'f', b'b', b'c', b'a', b'd', b'e'}

5.散列简介

散列存储多个键值对。散列存储的值可以是字符串或数字值,可以对散列存储的数执行自增自减操作。

散列常用命令

命令 行为
HSET 在散列里面关联起给定的键值对
HGET 获取指定散列键的值
HGETALL 获取散列包含的所有键值对
HDEL 如果给定的键存在于散列,移除这个键
HLEN HLEN key-name:返回散列包含的键值对数量
HMGET HMGET key-name key [key ...]:从散列中获取一个或者多个键的值
HMSET HMSET key value [key value ...]:为散列里面一个或者多个键设置值

例子:

127.0.0.1:6379> hset hash-set sub-key1 value1
(integer) 1
127.0.0.1:6379> hset hash-set sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-set sub-key1 value
(integer) 0
127.0.0.1:6379> hgetall hash-set
1) "sub-key1"
2) "value"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hdel hash-set sub-key2
(integer) 1
127.0.0.1:6379> hdel hash-set sub-key2
(integer) 0
127.0.0.1:6379> hgetall hash-set
1) "sub-key1"
2) "value"
127.0.0.1:6379> hlen hash-set
(integer) 1

Redis散列高级特性

命令 描述
HEXISTS HEXISTS key-name key:检查给定键是否存在于散列中
HKEYS HKEYS key-name:获取散列包含的所有键
HVALS HVALS key-name:获取散列包含的所有值
HINCRBY HINCRBY key-name key increment:将键key存储的值加上整数increment
HINCRBYFLOAT HINCRBYFLOAT key-name key increment:将键key存储的值加上浮点数increment

例子:

conn.hmset('hash-key2', {'short':'hello', 'long': 1000 * '1'})
True
conn.exists('hash-key2')
True
conn.hexists('hash-key2', 'num')
False
conn.hincrby('hash-key2', 'num')
1
conn.hexists('hash-key2', 'num')
True

6.有序集合简介

有序集合也用来存储键值对,但是键值对的键被称为成员(member),每个成员的都是各不相同的;有序集合的值被称为分值(score),分值必须为浮点数。
有序集合时候Rediscover中唯一一个既可以根据成员访问元素,也可以根据分值以及分值的排列顺序访问的元素的结构。

有序集合常见方法:

命令 行为
ZADD ZADD key-name score member [score meter ...]:将带有给定分值的成员添加到有序集合里面
ZREM ZREM key-name member [member ...]:从有序集合中移除给定的成员,并返回被移除的成员的数量
ZCARD ZCARD key-name:返回有序集合包含的成员的数量
ZINCRBY ZINCRBY key-name increment member:将member成员的分值加上increment
ZCOUNT ZCOUNT key-name min max:返回分值介于min和ma之间的成员数量
ZRANK ZRANK key-name member:返回成员member在有序集合中的排名
ZSCORE ZSCORE key-name member:返回成员member的分值
ZRANGE ZRANGE key-name start stop [WITHSCORES]:格局有序集合中排名在start和stop之间的成员,如果给定了withscore选项,那么分值也一起返回

例子:

127.0.0.1:6379> zadd zset-key 728 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1
1) "member1"
2) "member0"
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800
1) "member1"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
127.0.0.1:6379> zrem zset-key member1
(integer) 1
127.0.0.1:6379> zrem zset-key member1
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

有序集合中的其他命令

命令 描述
ZREVRANK ZREVRANK key-name member:返回有序集合中成员member的排名,成员按照分值由由大到小排列
ZREVRANGE ZREVRANGE key-name start stop:返回有序集合中给定排名范围内的成员,成员按照分值从大到小排列
ZRANGEBYSCORE ZRANGEBYSCORE key max min :获取有序元素在给定分值范围内的所有元素
ZREVRANGEBYSCORE ZREVRANGEBYSCORE key max min :获取有序元素在给定分值范围内的所有元素,并按照分值从大到小来排列
ZREMRANGEBYRANK ZREMRANGEBYRANK key-name start stop:移除有序集合中排名介于start和stop之间的所有成员
ZREMRANGEBYSCORE ZREMRANGEBYSCORE key-name min max:移除有序集合中分值介于min和max之间的所有成员
ZINTERSTORE ZINTERSTORE dest-key key-count key [key ...] [WEIGHT weight] [weight ...] [AGGREGATE SUM|MIN|MAX]:对于给定的有序集合执行类似集合的交集运算
ZUNIONSTORE ZUNIONSTORE dest-key key-count key [key ...] [WRIGHT weight] [weight ...] [AGGREGATE SUM|MIN|MAX]:对于给定的有序集合执行类似集合的并集运算

例子:

conn.zadd('zset-1', 'a', 1, 'b', 2, 'c', 3)
3
conn.zadd('zset-2', 'b', 4, 'c', 1, 'd', 0)
3
conn.zinterstore('zset-i', ['zset-1', 'zset-2'])
2
conn.zrange('zset-i', 0, -1, withscores=True)
[(b'c', 4.0), (b'b', 6.0)]
conn.zunionstore('zset-u', ['zset-1', 'zset-2'], aggregate='min')
4
conn.zrange('zset-u', 0, -1, withscores=True)
[(b'd', 0.0), (b'a', 1.0), (b'c', 1.0), (b'b', 2.0)]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容