Redis

一、 Redis 简介

Remote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis 有三个主要特点,使它优越于其它键值数据存储系统

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

 

Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 支持丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 操作具有原子性。意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

 

Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的,同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

 

Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

redis> SELECT 1

OK

redis [1] > GET foo

(nil)

 

然而这些以数字命名的数据库又与我们理解的数据库有所区别。

  • 首先,Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
  • 另外,Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。
  • 综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

 

二、Redis配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf (Windows 名为 redis.windows.conf)。通过 CONFIG 命令查看或设置配置项。

1. 查看配置

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"

 

使用 * 号获取所有配置项

redis 127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "dump.rdb"
......

 

2. 编辑配置

你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK

redis 127.0.0.1:6379> CONFIG GET loglevel 
1) "loglevel"
2) "notice"

 

3. 参数说明

redis.conf 配置项说明如下:

daemonize no    
Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no )
pidfile /var/run/redis.pid
当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
port 6379
指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口,因为 6379 在手机按键上 MERZ 对应的号码,而 MERZ 取自意大利歌女 Alessia Merz 的名字 bind 127.0.0.1
绑定的主机地址
timeout 300
当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
loglevel notice
指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
logfile stdout
日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给
/dev/null databases 16
  设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
save <seconds> <changes> Redis 默认配置文件中提供了三个条件: save 900 1 save 300 10 save 60 10000 分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒内有 10000 个更改。 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
rdbcompression yes
指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
dbfilename dump.rdb
指定本地数据库文件名,默认值为 dump.rdb
dir ./
指定本地数据库存放目录
slaveof <masterip> <masterport>
设置当本机为 slav 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
masterauth <master-password>
当 master 服务设置了密码保护时,slav 服务连接 master 的密码
requirepass foobared
设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH
<password> 命令提供密码,默认关闭 maxclients 128
设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxmemory <bytes>
指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区
appendonly no
指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为 no
appendfilename appendonly.aof
指定更新日志文件名,默认为 appendonly.aof
appendfsync everysec 指定更新日志条件,共有 3 个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折中,默认值) vm-enabled no
指定是否启用虚拟内存机制,默认值为 no,简单的介绍一下,VM 机制将数据分页存放,由 Redis 将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析 Redis 的 VM 机制)
vm-swap-file /tmp/redis.swap
虚拟内存文件路径,默认值为 /tmp/redis.swap,不可多个 Redis 实例共享 vm-max-memory 0
将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所有索引数据都是内存存储的(Redis 的索引数据 就是 keys),也就是说,当 vm-max-memory 设置为 0 的时候,其实是所有 value 都存在于磁盘。默认值为 0 vm-page-size 32
Redis swap 文件分成了很多的 page,一个对象可以保存在多个 page 上面,但一个 page 上不能被多个对象共享,vm-page-size 是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page 大小最好设置为 32 或者 64bytes;如果存储很大大对象,则可以使用更大的 page,如果不确定,就使用默认值 vm-pages 134217728
设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是在放在内存中的,,在磁盘上每 8 个 pages 将消耗 1byte 的内存。 vm-max-threads 4
设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
glueoutputbuf yes
设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
hash-max-zipmap-entries 64 hash-max-zipmap-value 512
指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
activerehashing yes
指定是否激活重置哈希,默认为开启(后面在介绍 Redis 的哈希算法时具体介绍)
include /path/to/local.conf
指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

 

三、Redis数据类型

Redis支持五种数据类型:

类型简介特性场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M ---
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线)2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1)2、为集合提供了求交集、并集、差集等操作 1、共同好友2、利用唯一性,统计访问网站的所有独立ip3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜2、带权重的消息队列


注 - Redis命令不区分大小写,如SET,Set和set都是同一个命令

 

1. String(字符串)

  Redis中的字符串是一个字节序列。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型的值最大能存储 512MB。

redis 127.0.0.1:6379> set name "yiibai.com" 
OK 

redis 127.0.0.1:6379> get name 
"yiibai.com"

 

在上面的示例中,setget是Redis命令,name是Redis中使用的键,yiibai.com是存储在Redis中的字符串的值。

 

2. Hash(哈希)

  Redis散列/哈希(Hashes)是键值对的集合。Redis散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。每个 hash 可以存储 232 -1 键值对(40多亿)。使用场景:存储、读取、修改用户属性

 

redis 127.0.0.1:6379> HMSET ukey username "yiibai" password "passswd123" points 200

在上例中,散列/哈希数据类型用于存储包含用户的基本信息的用户对象。这里HMSET是Redis的命令,而ukey是键的名称。

 

redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"

redis 127.0.0.1:6379> HGET runoob field1
"Hello"

redis 127.0.0.1:6379> HGET runoob field2
"World"

实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。

 

3. List(列表)

Redis列表只是字符串列表,按插入顺序排序。您可以向Redis列表的头部或尾部添加元素。

使用场景:

  (1)最新消息排行等功能(比如朋友圈的时间线)

  (2)消息队列

redis 127.0.0.1:6379> lpush alist redis
(integer) 1

redis 127.0.0.1:6379> lpush alist mongodb
(integer) 2

redis 127.0.0.1:6379> lpush alist sqlite
(integer) 3

redis 127.0.0.1:6379> lrange alist 0 10  
1) "sqlite"
2) "mongodb"
3) "redis"

列表的最大长度为232 - 1个元素(4294967295,每个列表可容纳超过40亿个元素)。

 

4. Set(集合)

Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

一个集合中的最大成员数量为232 - 1(即4294967295,每个集合中元素数量可达40亿个)个。

使用场景:

  (1) 共同好友

  (2) 利用唯一性,统计访问网站的所有独立ip

  (3) 好友推荐时,根据tag求交集,大于某个阈值就可以推荐

sadd 命令:添加一个string元素到 key对应的set集合中,成功返回1,如果元素已经在集合中返回0, key对应的set不存在返回错误。

redis 127.0.0.1:6379> sadd yiibailist redis
(integer) 1

redis 127.0.0.1:6379> sadd yiibailist mongodb
(integer) 1

redis 127.0.0.1:6379> sadd yiibailist sqlite
(integer) 1

redis 127.0.0.1:6379> sadd yiibailist sqlite
(integer) 0

redis 127.0.0.1:6379> smembers yiibailist  
1) "sqlite"
2) "mongodb"
3) "redis"

注意在上面的示例中,sqlite被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。

 

5. zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

使用场景:

  (1)排行榜

  (2)带权重的消息队列

 

zadd 命令:添加元素到集合,元素在集合中存在则更新对应score

redis 127.0.0.1:6379> zadd redis.net.cn 0 redis
(integer) 1
 
redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb
(integer) 1

redis 127.0.0.1:6379> zadd redis.net.cn 1 rabitmq
(integer) 1

redis 127.0.0.1:6379> zadd redis.net.cn 1 rabitmq
(integer)  0
 

redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 1000
1) "redis"
2) "mongodb"
3) "rabitmq"

因为 ‘rabitmq‘ 的排序值是 1 ,其它两个元素的排序值是 0 ,所以‘rabitmq‘ 排在最后一个位置上。

 

四、 Redis 命令

redis 命令用于在 redis 服务上执行操作。

服务端:redis-server

客户端:redis-cli

要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。

Redis 客户端的基本语法为:

$ redis-cli

示例1:启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。

$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动

 

示例2:如果需要在远程 redis 服务上执行命令语法:$ redis-cli -h host -p port -a password

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

 

有时候会有中文乱码。要在 redis-cli 后面加上 --raw 就可以避免中文乱码了

redis-cli --raw

 

五、Redis 键(key) 

下表列出了与键相关的一些基本命令。

 

编号

命令

描述

1

DEL key

此命令删除一个指定键(如果存在)。

2

DUMP key

此命令返回存储在指定键的值的序列化版本。

3

EXISTS key

此命令检查键是否存在。

4

EXPIRE key seconds

设置键在指定时间秒数之后到期/过期。

5

EXPIREAT key timestamp

设置在指定时间戳之后键到期/过期。时间是Unix时间戳格式。

6

PEXPIRE key milliseconds

设置键的到期时间(以毫秒为单位)。

7

PEXPIREAT key milliseconds-timestamp

以Unix时间戳形式来设置键的到期时间(以毫秒为单位)。

8

KEYS pattern

查找与指定模式匹配的所有键。

9

MOVE key db

将键移动到另一个数据库。

10

PERSIST key

删除指定键的过期时间,得永生。

11

PTTL key

获取键的剩余到期时间。

12

RANDOMKEY

从Redis返回一个随机的键。

13

RENAME key newkey

更改键的名称。

14

PTTL key

获取键到期的剩余时间(以毫秒为单位)。

15

RENAMENX key newkey

如果新键不存在,重命名键。

16

TYPE key

返回存储在键中的值的数据类型。

 

redis 127.0.0.1:6379> SET akey redis
OK

redis 127.0.0.1:6379> GET akey
"redis"

redis 127.0.0.1:6379> DEL akey
(integer) 1

redis 127.0.0.1:6379> GET akey
(nil)

 

keys * 查看当前数据库所有的key
keys no*  查看当前数据库所有的以no开头的key

清空数据库

flushdb 清空当前的数据库
flushall 清空所有数据库(清空0-16个数据库)

切换数据库

select 1

 六、Redis 字符串

下表列出了一些用于在Redis中管理字符串的基本命令。

 

编号

命令

描述说明

1

SET key value

此命令设置指定键的值。

2

GET key

获取指定键的值。

3

GETRANGE key start end

获取存储在键上的字符串的子字符串。

4

GETSET key value

设置键的字符串值并返回其旧值。

5

GETBIT key offset

返回在键处存储的字符串值中偏移处的位值。

6

MGET key1 [key2..]

获取所有给定键的值

7

SETBIT key offset value

存储在键上的字符串值中设置或清除偏移处的位

8

SETEX key seconds value

使用键和到期时间来设置值

9

SETNX key value

设置键的值,仅当键不存在时

10

SETRANGE key offset value

在指定偏移处开始的键处覆盖字符串的一部分

11

STRLEN key

获取存储在键中的值的长度

12

MSET key value [key value …]

为多个键分别设置它们的值

13

MSETNX key value [key value …]

为多个键分别设置它们的值,仅当键不存在时

14

PSETEX key milliseconds value

设置键的值和到期时间(以毫秒为单位)

15

INCR key

将键的整数值增加1

16

INCRBY key increment

将键的整数值按给定的数值增加

17

INCRBYFLOAT key increment

将键的浮点值按给定的数值增加

18

DECR key

将键的整数值减1

19

DECRBY key decrement

按给定数值减少键的整数值

20

APPEND key value

将指定值附加到键

 

redis 127.0.0.1:6379>mset one 1 two 2 three 3
redis 127.0.0.1:6379>mget one two three

3秒过期

redis 127.0.0.1:6379>setex one 3 "abc"
redis 127.0.0.1:6379>get two
"2"

追加

redis 127.0.0.1:6379>apend rwo "3456"
(integer) 5
redis 127.0.0.1:6379>get two
"23456"

 

七、Redis 哈希 Hash

 Redis Hashes是字符串字段和字符串值之间的映射(类似于PHP中的数组类型)。 因此,它们是表示对象的完美数据类型。

 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)

 

下表列出了 redis hash 基本的相关命令:

 

序号

命令及描述

1

HDEL key field2 [field2] 删除一个或多个哈希表字段

2

HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。

3

HGET key field 获取存储在哈希表中指定字段的值/td>

4

HGETALL key 获取在哈希表中指定 key 的所有字段和值

5

HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。

6

HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。

7

HKEYS key 获取所有哈希表中的字段

8

HLEN key 获取哈希表中字段的数量

9

HMGET key field1 [field2] 获取所有给定字段的值

10

HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。

11

HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。

12

HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。

13

HVALS key 获取哈希表中所有值

14

HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。

 

redis 127.0.0.1:6379>hset student age 18 gender true
(interger) 2

redis 127.0.0.1:6379>hget student age 
"18"

redis 127.0.0.1:6379>hmget student age gender name
1) "18"
2) "true"
3) (nil)

redis 127.0.0.1:6379>hkeys student
"age"
"gender"

redis 127.0.0.1:6379>hvals student
"18"
"true"

redis 127.0.0.1:6379>hdelt student age gender
(interger) 2

 

八、Redis列表

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

下表列出了与列表相关的一些基本命令。

序号

命令

说明

1

BLPOP key1 [key2 ] timeout

删除并获取列表中的第一个元素,或阻塞,直到有一个元素可用

2

BRPOP key1 [key2 ] timeout

删除并获取列表中的最后一个元素,或阻塞,直到有一个元素可用

3

BRPOPLPUSH source destination timeout

从列表中弹出值,将其推送到另一个列表并返回它;或阻塞,直到一个可用

4

LINDEX key index

通过其索引从列表获取元素

5

LINSERT key BEFORE/AFTER pit value

在列表中的另一个元素之前或之后插入元素

6

LLEN key

获取列表的长度

7

LPOP key

删除并获取列表中的第一个元素

8

LPUSH key value1 [value2]

将一个或多个值添加到列表

9

LPUSHX key value

仅当列表存在时,才向列表添加值

10

LRANGE key start stop

从列表中获取一系列元素

11

LREM key count value

从列表中删除元素。Count>0,从头删;count<0,从尾删;count<0,符合条件的都删;

12

LSET key index value

通过索引在列表中设置元素的值(可用于更新)

13

LTRIM key start stop

修剪列表的指定范围

14

RPOP key

删除并获取列表中的最后一个元素

15

RPUSH key value1 [value2]

将一个或多个值附加到列表

16

RPUSHX key value

仅当列表存在时才将值附加到列表

 

 

redis 127.0.0.1:6379> LPUSH mylist "redis" 
(integer) 1 

redis 127.0.0.1:6379> LPUSH mylist "mongodb"
(integer) 2 

redis 127.0.0.1:6379> LPUSH mylist "mysql"
(integer) 3 

redis 127.0.0.1:6379> LRANGE mylist 0 10  
1) "mysql" 
2) "mongodb" 
3) "redis"

在上面的示例中,通过命令LPUSH将三个值插入到名称为“mylist”的Redis列表中。

redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1

redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2

redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3

redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4

redis 127.0.0.1:6379> RPOP mylist
OK

redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello"
3) "foo"

 

九、 集合(set)

下表列出了与集合相关的一些基本命令。

序号

命令

说明

1

SADD key member1 [member2]

将一个或多个成员添加到集合

2

SCARD key

获取集合中的成员数

3

SDIFF key1 [key2]

减去多个集合

4

SDIFFSTORE destination key1 [key2]

减去多个集并将结果集存储在键中

5

SINTER key1 [key2]

相交多个集合

6

SINTERSTORE destination key1 [key2]

交叉多个集合并将结果集存储在键中

7

SISMEMBER key member

判断确定给定值是否是集合的成员

8

SMOVE source destination member

将成员从一个集合移动到另一个集合

9

SPOP key

从集合中删除并返回随机成员

10

SRANDMEMBER key [count]

从集合中获取一个或多个随机成员

11

SREM key member1 [member2]

从集合中删除一个或多个成员

12

SUNION key1 [key2]

添加多个集合

13

SUNIONSTORE destination key1 [key2]

添加多个集并将结果集存储在键中

14

SSCAN key cursor [MATCH pattern] [COUNT count]

递增地迭代集合中的元素

15

SMEMBERS key

查看键中的所有元素

 

Redis SREM命令用于从所述一组保存在键中删除指定的元素。如果成员不存在,则命令返回0,如果没有设置在关键存储的值,则返回一个错误。

redis 127.0.0.1:6379>sadd myset "hello"
(integer) 1

redis 127.0.0.1:6379>sadd myset "foo"
(integer) 1

redis 127.0.0.1:6379>sadd myset "hello"
(integer) 0

redis 127.0.0.1:6379>smembers myset
1) "hello"
2) "foo"

redis 127.0.0.1:6379>sismembers hello
(integer) 1

redis 127.0.0.1:6379> srem myset1 "hello"
(integer) 1

 

十、有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

下表列出了 redis 有序集合的基本命令:

 

序号

命令及描述

1

ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数

2

ZCARD key 获取有序集合的成员数

3

ZCOUNT key min max 计算在有序集合中指定区间分数的成员数

4

ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment

5

ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果存在新的有序集合 key 中

6

ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量

7

ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员

8

ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员

9

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员

10

ZRANK key member 返回有序集合中指定成员的索引

11

ZREM key member [member ...] 移除有序集合中的一个或多个成员

12

ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员

13

ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员

14

ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员

15

ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底

16

ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序

17

ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

18

ZSCORE key member 返回有序集中,成员的分数值

19

ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中

20

ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

 

redis 127.0.0.1:6379>zadd myset 1 "hello"
(integer) 1

redis 127.0.0.1:6379>zadd myset 1 "foo"
(integer) 1

redis 127.0.0.1:6379>zadd myset 2 "world" 3 "bar"
(integer) 2

redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "hello"
2) "1"
3) "foo"
4) "1"
5) "world"
6) "2"
7) "bar"
8) "3"

查看索引0到最后一个
redis 127.0.0.1:6379>zrange myzset 0 -1        
1) "hello"
2) "foo"
3) "world"
4) "bar"


redis 127.0.0.1:6379> zrangebyscore myzset 2 3        
1) "world"
2) "bar"

redis 127.0.0.1:6379> zscore myzset world    
 "2"

redis 127.0.0.1:6379> zrem myzset world    
(integer) 1

redis 127.0.0.1:6379> zremrangebyscore myzset 1 3    
(integer) 3

 

 十一、 python与redis交互

 

安装:pip install redis

导入模块:from redis import *

创建StrictRedis

通过init创建对象,指定参数host、port与指定的服务器和端口连接。

host默认为localhost; port默认为6379; db默认为0; 默认没有密码。

red = StrictRedis(host='localhost', port=6379, db=0)

方法与操作string实例(其他类型操作类似)

from redis import *
if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器连接
        rds=StrictRedis()
        key='pyone'

        # 新增一个string类型
        result=rds.set(key','xianyuplus')
        # 成功打印True,失败打印False
        print(result)

        #查询键key的值
        result = rds.get(key)
        #输出键的值,如果键不存在则返回None
        print(result)

        #无则添加,有则修改
        result = rds.set(key,'xianyu')
       #输出响应结果,如果操作成功则返回True,否则返回False
        print(result)

        #删除键的值
        result = rds.delete(key)
        #输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
        print(result)

        #获取所有的键
        result=rds.keys()
        #输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
        print(result)

    except Exception as e:
        print(e)

十二、redis搭建主从服务(ubuntu)

什么是主从服务

 

  • 一个master可以拥有多个slave,一个slave可以拥有多个slave,如此下去,形成了多级服务器集群架构
  • master用来写数据, slave用来读数据, 经统计:网站的读写比率是10:1
  • 通过主从配置可以实现读写分离
  • master和slave都是一个redis实例 (redis服务)

 

配置主

vim etc/redis/redis.conf

bind [本机ip]

sudo service redis stop

redis-server redis.conf

 

配置从

sudo cp redis.conf ./slave.conf

vim slave.conf

bind [主配置的ip]

slaveof [主配置的ip 端口号]

port 6378 --这个端口号不能和主配置的相同

sudo redis-server slave.conf

 

查看主从关系

redis-cli -h [主配置的ip] info Replication

 

主从测试

主配置上写入数据:set xianyu xianyuplus

从配置上读取数据:get xianyu

 

 

 

posted @ 2019-09-01 17:56  PythonGirl  阅读(182)  评论(0)    收藏  举报