redis入门(2):redis五大数据类型和操作方法

试验环境:

参照:

Redis 数据类型简介

Redis支持五种数据类型:

  • string(字符串)
  • hash(哈希)
    键值对、特别适合存储对象、键和值都是字符串
  • list(列表)
    字符串列表、链表结构
  • set(集合)
    字符串集合、非重复、无序、基于hash原理
  • zset(sorted set:有序集合)
    在set基础上添加了用于排序的权重属性

他们的组织特点如下图所示:
在这里插入图片描述

一、 键命令与其他

其实redis像是一个全局的键值对,键是string,值就是上面说的5大数据类型,那么关于键的命令有哪些呢?

  • 判断键是否存在
  • 返回键对应值的数据类型
  • 删除键
  • 给键设置过期时间
  • 查看键的过期时间
  • 移除键的过期时间
  • 根据条件查找键
  • 移动键到其他数据库(redis默认有16个[0-15])

下面以字符串类型的键为例做试验:

1.1 查看当前连接的是哪个数据库(redis默认有16个)

redis本身没有提供这个命令,但是从命令行的提示中可以看出来[1]…

127.0.0.1:6500> select 1
OK
127.0.0.1:6500[1]> select 0
OK
1.2 切换当前使用的数据库:select 0
1.3 判断键“str-value”是否存在:exists str-key
127.0.0.1:6500> exists str-key
(integer) 0
127.0.0.1:6500> set str-key str-value
OK
127.0.0.1:6500> exists str-key
(integer) 1

键存在返回1,否则返回0

1.4 设置键“str-key”的值为“str-value”:set str-key str-value
127.0.0.1:6500> set str-key str-value
OK
1.5 判断键(str-key)存储的数据类型
127.0.0.1:6500> type str-key
string
1.6 新添加两个键,然后搜索
127.0.0.1:6500> set key1 "hello,redis"
OK
127.0.0.1:6500> set key2 "who are you"
OK
127.0.0.1:6500> keys *
1) "key2"
2) "key1"
3) "str-key"
127.0.0.1:6500> keys "*1*"
1) "key1"
1.7 给键“key2”设置过期时间,并查看剩余的逗留时间及过期效果
127.0.0.1:6500> keys *
1) "key2"
2) "key1"
3) "str-key"
127.0.0.1:6500> ttl key2
(integer) -1
127.0.0.1:6500> expire key2 30
(integer) 1
127.0.0.1:6500> ttl key2
(integer) 26
127.0.0.1:6500> ttl key2
(integer) 15
127.0.0.1:6500> get key2
"who are you?"
127.0.0.1:6500> ttl key2
(integer) 3
127.0.0.1:6500> ttl key2
(integer) -2
127.0.0.1:6500> get key2
(nil)
127.0.0.1:6500> keys *
1) "key1"
2) "str-key"
127.0.0.1:6500> 

可以看到key2在过期时间到了之后就被移除了,也就查不到了,并且ttl key2返回的是-2(表示的是不存在,也就是过期了被删除了),如果返回的是-1那么表示的是没有设置过期时间。
需要注意的是:
1. 访问键并不能延长过期时间,这点像是缓存中的绝对过期窗口,而不是滑动窗口。
2. 当set name 123这样的写入命令执行后,redis会自动将过期时间清除掉。

1.8 移除过期时间:persist key1
127.0.0.1:6500> keys *
1) "key1"
2) "str-key"
127.0.0.1:6500> ttl key1
(integer) -1
127.0.0.1:6500> expire key1 60
(integer) 1
127.0.0.1:6500> ttl key1
(integer) 53
127.0.0.1:6500> persist key1
(integer) 1
127.0.0.1:6500> ttl key1
(integer) -1
127.0.0.1:6500> keys *
1) "key1"
2) "str-key"

可以看到,移除了设置的过期时间后ttl key1返回的是-1,表示没有设置过期时间

1.9 删除键:del str-key key1
127.0.0.1:6500> keys *
1) "key1"
2) "str-key"
127.0.0.1:6500> del str-key key1
(integer) 2
127.0.0.1:6500> keys *
(empty list or set)
1.10 清空当前数据库所有的键(flushdb)和获取当前数据库键的数目(dbsize)
127.0.0.1:6500> mset name xiaoming age 20
OK
127.0.0.1:6500> keys *
1) "age"
2) "name"
127.0.0.1:6500> dbsize
(integer) 2
127.0.0.1:6500> flushdb
OK
127.0.0.1:6500> dbsize
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
1.11 清空所有数据库的键
127.0.0.1:6500> mset name xiaoming age 20
OK
127.0.0.1:6500> keys *
1) "age"
2) "name"
127.0.0.1:6500> select 1
OK
127.0.0.1:6500[1]> mset name liubei age 42
OK
127.0.0.1:6500[1]> keys *
1) "age"
2) "name"
127.0.0.1:6500[1]> flushall
OK
127.0.0.1:6500[1]> keys *
(empty list or set)
127.0.0.1:6500[1]> select 0
OK
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> dbsize
(integer) 0

可以看到当执行完flushall之后所有数据库的键都清空了

1.12 显示服务器信息:info
127.0.0.1:6500> info
# Server
redis_version:5.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9bc5faffaf0d982
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:7456
run_id:1147277d6663523903bdb9c7f3d9f6b0535dbab8
tcp_port:6500
uptime_in_seconds:610
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:5554456
executable:/usr/local/redis/bin/./redis-server
config_file:/usr/local/redis/bin/./redis.conf

# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

# Memory
used_memory:912592
used_memory_human:891.20K
used_memory_rss:2277376
used_memory_rss_human:2.17M
used_memory_peak:912592
used_memory_peak_human:891.20K
used_memory_peak_perc:100.05%
used_memory_overhead:911030
used_memory_startup:861336
used_memory_dataset:1562
used_memory_dataset_perc:3.05%
allocator_allocated:878768
allocator_active:2239488
allocator_resident:2239488
total_system_memory:1019797504
total_system_memory_human:972.55M
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:2.55
allocator_frag_bytes:1360720
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.02
rss_overhead_bytes:37888
mem_fragmentation_ratio:2.59
mem_fragmentation_bytes:1398608
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence
loading:0
rdb_changes_since_last_save:9
rdb_bgsave_in_progress:0
rdb_last_save_time:1565835431
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:98304
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0

# Stats
total_connections_received:1
total_commands_processed:22
instantaneous_ops_per_sec:0
total_net_input_bytes:654
total_net_output_bytes:523
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:627
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication
role:master
connected_slaves:0
master_replid:334e71476038d15a2a848bcd815914efa329a7ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:1.171599
used_cpu_user:0.654350
used_cpu_sys_children:0.004115
used_cpu_user_children:0.000000

# Cluster
cluster_enabled:0

# Keyspace
1.13 显示所有连接到这个server的客户端:client list
127.0.0.1:6500> client list
id=3 addr=127.0.0.1:38380 fd=7 name= age=888 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client

二、 字符串操作命令

2.1 设置和获取字符串:set blog_title "this is a amazing girl!"get blog_title
127.0.0.1:6500> set blog_title "this is a amazing girl!"
OK
127.0.0.1:6500> get blog_title
"this is a amazing girl!"

其实这里的设置是有则覆盖,没有就新建。

2.2 根据起始索引获取子字符串:getrange blog_title 2 3
127.0.0.1:6500> getrange blog_title 2 3
"is"
2.3 给字符串设置新值并返回之前的值:getset blog_title “haha this is a new title!”
127.0.0.1:6500> getset blog_title "haha this is a new title!"
"this is a amazing girl!"
127.0.0.1:6500> get blog_title
"haha this is a new title!"
2.4 新设置字符串键,并批量获取这些键:mget blog_user blog_title
127.0.0.1:6500> keys *
1) "blog_title"
127.0.0.1:6500> set blog_user "jackletter"
OK
127.0.0.1:6500> keys *
1) "blog_user"
2) "blog_title"
127.0.0.1:6500> mget blog_user blog_title
1) "jackletter"
2) "haha this is a new title!"
2.5 设置字符串的过期时间和值:setex blog_user 60 xiaoming
127.0.0.1:6500> setex blog_user 60 xiaoming
OK
127.0.0.1:6500> ttl blog_user
(integer) 51
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> persist blog_user
(integer) 1
127.0.0.1:6500> ttl blog_user
(integer) -1
127.0.0.1:6500> get blog_user
"xiaoming"
2.6 只有当字符串键不存在时才设置值:setnx blog_user nouser
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> setnx blog_user nouser
(integer) 0
127.0.0.1:6500> get blog_user
"xiaoming"

可以看到当blog_user 存在值的时候是没有设置进去的,这区别于set key value

2.7 返回字符串的长度:strlen blog_user
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> strlen blog_user
(integer) 8
2.8 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始(SETRANGE key offset value):setrange blog_user 4 new
127.0.0.1:6500> get blog_user
"xiaoming"
127.0.0.1:6500> setrange blog_user 4 new
(integer) 8
127.0.0.1:6500> get blog_user
"xiaonewg"
2.9 同时设置一个或多个 key-value 对:mset blog_time 2019-08-14 blog_theme redis-talking
127.0.0.1:6500> keys *
1) "blog_user"
2) "blog_title"
127.0.0.1:6500> mset blog_time 2019-08-14 blog_theme redis-talking
OK
127.0.0.1:6500> keys *
1) "blog_theme"
2) "blog_time"
3) "blog_user"
4) "blog_title"
2.10 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在:msetnx blog_time 2018-08-14 blog_theme redis-talking
192.168.0.100:6500> keys *
(empty list or set)
192.168.0.100:6500> set blog_time 2018-02-02
OK
192.168.0.100:6500> get blog_time
"2018-02-02"
192.168.0.100:6500> msetnx blog_time 2019-02-02 blog_user xiaoming
(integer) 0
192.168.0.100:6500> keys *
1) "blog_time"
192.168.0.100:6500> get blog_time
"2018-02-02"
192.168.0.100:6500> 

可以看到 blog_time的值并没有改变,“blog_user” 也并没有被添加到redis中。

2.11 字符串的递增和递减: incr testintincrby testint 4 decr testintdecrby testint 4incrbyfloat testint 0.23
127.0.0.1:6500> set testint 5
OK
127.0.0.1:6500> get testint
"5"
127.0.0.1:6500> incr testint
(integer) 6
127.0.0.1:6500> get testint
"6"
127.0.0.1:6500> incrby testint 4
(integer) 10
127.0.0.1:6500> get testint
"10"
127.0.0.1:6500> decr testint
(integer) 9
127.0.0.1:6500> get testint
"9"
127.0.0.1:6500> decrby testint 4
(integer) 5
127.0.0.1:6500> get testint
"5"
127.0.0.1:6500> incrbyfloat testint 0.23
"5.23"
127.0.0.1:6500> get testint
"5.23"
2.11 字符串的追加: append blog_user " lalala"
127.0.0.1:6500> get blog_user
"xiaonewg"
127.0.0.1:6500> append blog_user " lalala"
(integer) 15
127.0.0.1:6500> get blog_user
"xiaonewg lalala"
127.0.0.1:6500> keys *
1) "blog_user"
2) "blog_time"
3) "blog_theme"
4) "blog_title"
5) "testint"
127.0.0.1:6500> append testnew "append new"
(integer) 10
127.0.0.1:6500> get testnew
"append new"

这里可以看出,append其实是有则追加末尾,否则新增

三、哈希(hash)操作

概念说明:
对于每一个以hash结果存储的都称之为一个哈希表,它里面的每个键值对都称之为域

3.1 存储、获取、批量存储与获取哈希表中的域
127.0.0.1:6500> hset user name xiaoming
(integer) 1
127.0.0.1:6500> hset user age 20
(integer) 1
127.0.0.1:6500> hset user addr tianminglu
(integer) 1
127.0.0.1:6500> hget user name
"xiaoming"
127.0.0.1:6500> hget user age
"20"
127.0.0.1:6500> hmget user name age addr
1) "xiaoming"
2) "20"
3) "tianminglu"
127.0.0.1:6500> hmset user name liubei addr taohuayuan
OK
127.0.0.1:6500> hmget user name age addr
1) "liubei"
2) "20"
3) "taohuayuan"
3.2 获取哈希表中的所有域:hgetall
127.0.0.1:6500> hgetall user
1) "name"
2) "liubei"
3) "age"
4) "20"
5) "addr"
6) "taohuayuan"
3.3 获取哈希表中所有存储的域名:hkeys user
127.0.0.1:6500> hkeys user
1) "name"
2) "age"
3) "addr"
3.4 判断哈希表中是否存储了某个域:hexists key field
127.0.0.1:6500> hkeys user
1) "name"
2) "age"
3) "addr"
127.0.0.1:6500> hexists user name
(integer) 1
127.0.0.1:6500> hexists user no
(integer) 0
3.5 返回哈希表中域的数量:hlen user
127.0.0.1:6500> hkeys user
1) "name"
2) "age"
3) "addr"
127.0.0.1:6500> hlen user
(integer) 3
3.6 返回哈希表 user中所有域的值:hvals user
127.0.0.1:6500> hvals user
1) "liubei"
2) "20"
3) "taohuayuan"
3.7 删除哈希表中的一个或多个指定域,不存在的域将被忽略:hdel user name addr no
127.0.0.1:6500> hkeys user
1) "name"
2) "age"
3) "addr"
127.0.0.1:6500> hdel user name addr no
(integer) 2
127.0.0.1:6500> hkeys user
1) "age"
3.8 将哈希表中的域 field 的值设置为 value ,当且仅当域 field 不存在:hsetnx user age 18
127.0.0.1:6500> hkeys user
1) "age"
127.0.0.1:6500> hvals user
1) "20"
127.0.0.1:6500> hsetnx user age 18
(integer) 0
127.0.0.1:6500> hvals user
1) "20"

由此可看到,当age存在时并没有进行覆盖

四、列表操作(list)

说明:
列表是链状结构的,操作时可以从左边(头)或右边操作(尾),以左边操作为主。每次push和pop数据就像是将数据压入和弹出一样。

4.1 从左边压入数据:lpush list a b c d
127.0.0.1:6500> lpush list a b c d
(integer) 4
127.0.0.1:6500> lrange list 0 4
1) "d"
2) "c"
3) "b"
4) "a"
4.2 从右边压入数据: rpush list 1 2 3
127.0.0.1:6500> rpush list 1 2 3
(integer) 7
127.0.0.1:6500> lrange list 0 6
1) "d"
2) "c"
3) "b"
4) "a"
5) "1"
6) "2"
7) "3"
4.3 从左右两侧分别弹出数据 lpop list rpop list
127.0.0.1:6500> lpop list
"d"
127.0.0.1:6500> rpop list
"3"
127.0.0.1:6500> lrange list 0 4
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
4.4 压入和弹出操作说明
  • 压入和弹出都是操作的时候就指明了从哪边(左还是右或头还是尾),不像js中数组的push和pop都是从尾部操作的(从头部操作用的是shift:弹出,unshift:压入)
  • lrange命令是从左到右显示列表中的值(显示全部数据:lrange list 0 -1
  • 操作的图解:
    在这里插入图片描述
4.4 获取列表的存储数量:llen list
127.0.0.1:6500> llen list
(integer) 5
4.5 根据索引值获取列表中的元素:lindex list -1

说明: 索引为正数表示从左边开始,为负数表示从右边开始

127.0.0.1:6500> lrange list 0 10
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
127.0.0.1:6500> llen list
(integer) 5
127.0.0.1:6500> lindex list 0
"c"
127.0.0.1:6500> lindex list -1
"2"
4.6 插入数据:lLINSERT key BEFORE|AFTER pivot value

将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
127.0.0.1:6500> linsert list before a other
(integer) 6
127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "other"
4) "a"
5) "1"
6) "2"
127.0.0.1:6500> linsert list after other op
(integer) 7
127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "other"
4) "op"
5) "a"
6) "1"
7) "2"
4.7 更改list指定索引的值:lset list 3 new
127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "other"
4) "op"
5) "a"
6) "1"
7) "2"
127.0.0.1:6500> lset list 3 new
OK
127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "other"
4) "new"
5) "a"
6) "1"
7) "2"
4.8 裁剪列表:让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除:ltrim list 2 -2
127.0.0.1:6500> lrange list 0 -1
1) "c"
2) "b"
3) "other"
4) "new"
5) "a"
6) "1"
7) "2"
127.0.0.1:6500> ltrim list 2 -2
OK
127.0.0.1:6500> lrange list 0 -1
1) "other"
2) "new"
3) "a"
4) "1"
4.9 根据值移除列表中的元素(两种模式:移除几个或全部移除)lrem list [数量] a
127.0.0.1:6500> lpush list a a a a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
1) "a"
2) "a"
3) "a"
4) "a"
127.0.0.1:6500> lrem list 0 a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
(empty list or set)
127.0.0.1:6500> lpush list a a a a
(integer) 4
127.0.0.1:6500> lrange list 0 -1
1) "a"
2) "a"
3) "a"
4) "a"
127.0.0.1:6500> lrem list 2 a
(integer) 2
127.0.0.1:6500> lrange list 0 -1
1) "a"
2) "a"

1.如果要移除全部匹配的就是 lrem list 0 a
2.如果要移除2个匹配的就是lrem list 2 a

4.10 当这个列表存在时才压入数据:lpushx list2 arpushx list2 c
127.0.0.1:6500> lpushx list2 a
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> rpushx list2 c
(integer) 0
127.0.0.1:6500> keys *
(empty list or set)
4.11 将一个列表中的尾部数据移动到另一个列表的头部并返回这个值:rpoplpush list1 list2
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> lpush list1 1 2 3 4
(integer) 4
127.0.0.1:6500> rpoplpush list1 list2
"1"
127.0.0.1:6500> keys *
1) "list2"
2) "list1"
127.0.0.1:6500> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6500> lrange list2 0 -1
1) "1"
  • 原列表和目的列表可以是相同的,这样就可以给列表“旋转”了
  • 列表的这种操作常用在消息队列上
4.12 阻塞弹出值:blpop list 60brpop list1 list2 0

说明: 对于空列表进行阻塞,标题上显示的是60秒的等待时间,如果无线等待就是“0”,也可以同时等待多个列表直到弹出第一个
首先发起阻塞弹出命令:
在这里插入图片描述

可以看到窗口已经被阻塞了

在另一个窗口进行数据压入:
在这里插入图片描述
最后观察阻塞窗口的效果:
在这里插入图片描述

可以看到阻塞的窗口已经完成了数据的弹出

4.13 阻塞的命令还有“brpop”、“brpoplpush”,类似“blpop”

五、集合(set)操作

注意: 集合的特点是不重复、无序

5.1 向集合中添加数据 sadd set liubei guanyu zhangfei;显示集合数据 smembers set;显示集合元素数量scard set
127.0.0.1:6500> keys *
(empty list or set)
127.0.0.1:6500> sadd set liubei guanyu zhangfei
(integer) 3
127.0.0.1:6500> scard set
(integer) 3
127.0.0.1:6500> smembers set
1) "guanyu"
2) "liubei"
3) "zhangfei"
127.0.0.1:6500> sadd set liubei
(integer) 0
127.0.0.1:6500> smembers set
1) "guanyu"
2) "liubei"
3) "zhangfei"
5.2 判断集合中是否存在某个元素:sismember set liubei
127.0.0.1:6500> smembers set
1) "guanyu"
2) "liubei"
3) "zhangfei"
127.0.0.1:6500> sismember set liubei
(integer) 1
127.0.0.1:6500> sismember set xiaoming
(integer) 0
5.3 求集合交集:sinter set set2;求交集并以覆盖的方式存储到另外一个集合:sinterstore set3 set set2
127.0.0.1:6500> smembers set
1) "guanyu"
2) "liubei"
3) "zhangfei"
127.0.0.1:6500> smembers set2
1) "huangzhong"
2) "liubei"
3) "zhuge"
127.0.0.1:6500> smembers set3
1) "xiaoming"
127.0.0.1:6500> smembers inter
(empty list or set)
127.0.0.1:6500> sinter set set2
1) "liubei"
127.0.0.1:6500> sinterstore set3 set set2
(integer) 1
127.0.0.1:6500> smembers set3
1) "liubei"

注意: set3已经被交集覆盖了,即使交集的结果为空也会覆盖(相当于删除了)

5.4 求差集(第一个集合减去后面的集合):sdiff set set2 set3;求差集并且存储:sdiffstore set4 set set2 set3
127.0.0.1:6500> smembers set
1) "c"
2) "b"
3) "a"
127.0.0.1:6500> smembers set2
1) "1"
2) "a"
127.0.0.1:6500> smembers set3
1) "2"
2) "b"
127.0.0.1:6500> smembers set4
(empty list or set)
127.0.0.1:6500> sdiff set set2 set3
1) "c"
127.0.0.1:6500> sdiffstore set4 set set2 set3
(integer) 1
127.0.0.1:6500> smembers set4
1) "c"

注意:这个差集存储也是覆盖型的

5.5 求并集:sunion set set2;求并集并存储:sunionstore set3 set set2
127.0.0.1:6500> smembers set
1) "1"
2) "2"
127.0.0.1:6500> smembers set2
1) "b"
2) "a"
127.0.0.1:6500> smembers set3
(empty list or set)
127.0.0.1:6500> sunion set set2
1) "1"
2) "a"
3) "b"
4) "2"
127.0.0.1:6500> sunionstore set3 set set2
(integer) 4
127.0.0.1:6500> smembers set3
1) "1"
2) "a"
3) "b"
4) "2"

注意:这个并集的存储也是覆盖型的

5.6 移除集合中的元素:srem set 1
127.0.0.1:6500> smembers set
1) "1"
2) "2"
127.0.0.1:6500> srem set 1
(integer) 1
127.0.0.1:6500> smembers set
1) "2"
5.7 移动集合1中的元素到集合2中:smove set set2 1
127.0.0.1:6500> smembers set
1) "1"
2) "2"
127.0.0.1:6500> smembers set2
1) "b"
2) "a"
127.0.0.1:6500> smove set set2 1
(integer) 1
127.0.0.1:6500> smembers set
1) "2"
127.0.0.1:6500> smembers set2
1) "1"
2) "b"
3) "a"

六、有序集合(sorted set)

说明:
有序集合的权重又称之为score,它可以是整数的也可以是浮点型的

6.1 添加数据:zadd sortset 1.2 liubei 3.5 zhangfei 2.1 guanyu;查看数据:zrange sortset 0 -1 widthscores;获取集合存储数据数量:zcard sortset
127.0.0.1:6500> zadd sortset 1.2 liubei 3.5 zhangfei 2.1 guanyu
(integer) 3
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
3) "guanyu"
4) "2.1000000000000001"
5) "zhangfei"
6) "3.5"
127.0.0.1:6500> zrange sortset 0 -1
1) "liubei"
2) "guanyu"
3) "zhangfei"
127.0.0.1:6500> zcard sortset
(integer) 3
6.2 统计score在某一区间内的元素数量:zcount sortset 2 3.5
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
3) "guanyu"
4) "2.1000000000000001"
5) "zhangfei"
6) "3.5"
127.0.0.1:6500> zcount sortset 2 3.5
(integer) 2
6.3 返回有序集中,成员的分数值:zscore sortset liubei
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
3) "guanyu"
4) "2.1000000000000001"
5) "zhangfei"
6) "3.5"
127.0.0.1:6500> zscore sortset liubei
"1.2"
6.4 返回有序集合中指定成员的索引:zrank sortset guanyu
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
3) "guanyu"
4) "2.1000000000000001"
5) "zhangfei"
6) "3.5"
127.0.0.1:6500> zrank sortset guanyu
(integer) 1
6.5 移除有序集合中的一个或多个成员:zrem sortset guanyu zhangfei
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
3) "guanyu"
4) "2.1000000000000001"
5) "zhangfei"
6) "3.5"
127.0.0.1:6500> zrem sortset guanyu zhangfei
(integer) 2
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
6.6 有序集合中对指定成员的分数加上增量 increment: zincrby sortset 2 liubei
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "1.2"
127.0.0.1:6500> zincrby sortset 2 liubei
"3.2000000000000002"
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "liubei"
2) "3.2000000000000002"
6.7 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination:zinterstore sortset4 2 sortset sortset2
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
127.0.0.1:6500> zrange sortset2 0 -1 withscores
1) "b"
2) "1"
3) "c"
4) "2"
127.0.0.1:6500> zrange sortset3 0 -1 withscores
(empty list or set)
127.0.0.1:6500> zinterstore sortset3 2 sortset sortset2
(integer) 1
127.0.0.1:6500> zrange sortset3 0 -1 withscores
1) "b"
2) "3"
127.0.0.1:6500> zadd sortset4 4 hu
(integer) 1
127.0.0.1:6500> zrange sortset4 0 -1
1) "hu"
127.0.0.1:6500> zinterstore sortset4 2 sortset sortset2
(integer) 1
127.0.0.1:6500> zrange sortset4 0 -1 withscores
1) "b"
2) "3"

注意:这个求交集的时候必须指定交集运算的集合数量,还有交集的时候是把score相加的,当然对于目标集合是覆盖型的

6.8 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列:zrangebyscore sortset (1 4 withscores
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "a"
2) "1"
3) "c"
4) "2"
5) "b"
6) "4"
7) "d"
8) "4"
127.0.0.1:6500> zrangebyscore sortset (1 4 withscores
1) "c"
2) "2"
3) "b"
4) "4"
5) "d"
6) "4"
127.0.0.1:6500> zrangebyscore sortset -inf +inf withscores
1) "a"
2) "1"
3) "c"
4) "2"
5) "b"
6) "4"
7) "d"
8) "4"

score的区间:上面写法的意思(1 4是score>1并且score<=4的时候,-inf +inf表示的是全部的分数

6.9 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列:zrank sortset b
127.0.0.1:6500> zrange sortset 0 -1 withscores
1) "a"
2) "1"
3) "c"
4) "2"
5) "b"
6) "4"
7) "d"
8) "4"
127.0.0.1:6500> zrank sortset b
(integer) 2
6.10 其他的命令还有求并集的“ZUNIONSTORE”、根据排名删除的“ZREMRANGEBYRANK”、根据权重删除的“ZREMRANGEBYSCORE” 这里不再试验
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值