04-Redis

一、Redis基础

1.概述

Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。

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

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
  • Redis可以将数据复制到任意数量的从机中。

2.Redis的优点

  • 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
  • 操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

3.Redis与其他键值存储系统

  • Redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。
  • Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。
  • 内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。 因此,Redis可以做很少的内部复杂性。

二、Redis 的安装

第一步:安装Redis,打开终端执行以下命令
sudo apt-get install redis-server

第二步:启动Redis

redis-server

第三步:检查Redis是否正在工作

redis-cli

执行完得到的结果: 127.0.0.1:6379>则说明正常工作

说明:127.0.0.1是计算机的IP地址,6379是运行Redis服务器的端口。

第四步:执行PING命令。

redis 127.0.0.1:6379> ping 
PONG

得到结果为PONG表明Redis已成功安装

注意:在redis的server端,维护着多个数据库(默认为16个)
  所有的数据库以数组的形式保存在redisServer结构中

三、Redis keys 命令

下表给出了与 Redis 键相关的基本命令:

序号 命令及描述
1 DEL key该命令用于在 key 存在时删除 key
2 EXISTS key 检查给定 key 是否存在。
3 EXPIRE key seconds为给定 key 设置过期时间。
4 PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
5 KEYS pattern 查找所有符合给定模式( pattern)的 key 。
6 MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
7 PERSIST key 移除 key 的过期时间,key 将持久保持。
8 PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
9 TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
10 RANDOMKEY 从当前数据库中随机返回一个 key 。
11 RENAME key newkey 修改 key 的名称
12 TYPE key 返回 key 所储存的值的类型。

查找以 runoob 为开头的 key:

redis 127.0.0.1:6379> KEYS runoob*
1) "runoob3"
2) "runoob1"
3) "runoob2"

获取 redis 中所有的 key 可用使用 *****。

redis 127.0.0.1:6379> KEYS *
1) "runoob3"
2) "runoob1"
3) "runoob2"

四、数据类型

Redis支持5种数据类型。

1.字符串

String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等

下表列出了一些用于在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 将指定值附加到键
1.1设置

注 : Redis命令不区分大小写,如SET,Setset都是同一个命令。字符串值的最大长度为 512MB。

演示:

#1.设置键值
set name 'xiaoming'

#2.设置键值及过期时间,以秒为单位
setex name  10 'xiaoming' 

#3.设置多个键值
mset name "lili"  age  18  sex 'girl'
1.2获取

演示:

#1.据键获取值,如果键不存在则返回nil
get name

#2.根据多个键获取多个值
mget name age
1.3运算

要求:值是字符串类型的数字

演示:

#1.将key对应的值加1
incr age

#2.key对应的值减1
decr age

#3.将key对应的值加整数
incrby age 10

#4.将key对应的值减整数
decrby age  20
1.4其他

演示:

#1.追加值
append name "hello"
get name

#2.获取值长度
strlen name

2.哈希

Redis哈希(Hashes)是键值对的集合。Redis哈希是字符串字段和字符串值之间的映射。因此,它们用于存储对象。

序号 命令 说明
1 HDEL key field2 [field2] 删除一个或多个哈希字段。
2 HEXISTS key field 判断是否存在散列字段。
3 HGET key field 获取存储在指定键的哈希字段的值。
4 HGETALL key 获取存储在指定键的哈希中的所有字段和值
5 HINCRBY key field increment 将哈希字段的整数值按给定数字增加
6 HINCRBYFLOAT key field increment 将哈希字段的浮点值按给定数值增加
7 HKEYS key 获取哈希中的所有字段
8 HLEN key 获取散列中的字段数量
9 HMGET key field1 [field2] 获取所有给定哈希字段的值
10 [HMSET key field1 value1 field2 value2 ] 为多个哈希字段分别设置它们的值
11 HSET key field value 设置散列字段的字符串值
12 HSETNX key field value 仅当字段不存在时,才设置散列字段的值
13 HVALS key 获取哈希中的所有值
2.1设置

演示:

#1.设置单个值
hset ukey name 'zhangsan'

#2.设置多个值
hmset ukey username "xixi" password "123456"

#用于存储包含用户的基本信息的用户对象,ukey是哈希表的名称
2.2获取

演示:

#1.获取一个属性的值
hget ukey name

#2.获取多个属性的值
hmget ukey username password

#3.获取所有属性和值
hgetall ukey

#4.获取所有属性
hkeys ukey

#5.获取所有值
hvals ukey

#6.返回包含数据的个数
hlen ukey
2.3其他

演示:

#1.判断属性是否存在,存在返回1,不存在返回0
hexists ukey username

#2.删除属性及值
hdel ukey username 'xixi'

3.列表

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

列表的最大长度为2^32 - 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 pivot 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 从列表中删除元素
12 LSET key index value 通过索引在列表中设置元素的值
13 LTRIM key start stop 修剪列表的指定范围
14 RPOP key 删除并获取列表中的最后一个元素
15 RPOPLPUSH source destination 删除列表中的最后一个元素,将其附加到另一个列表并返回
16 RPUSH key value1 [value2] 将一个或多个值附加到列表
17 RPUSHX key value 仅当列表存在时才将值附加到列表
3.1设置

演示:

#1.在头部插入
127.0.0.1:6379> lpush alist redis
(integer) 1
127.0.0.1:6379> lpush alist mongodb
(integer) 2
127.0.0.1:6379> lpush alist mysql
(integer) 3
127.0.0.1:6379> lrange alist 0 10
1) "mysql"
2) "mongodb"
3) "redis"

#2.在尾部插入
127.0.0.1:6379> rpush alist aaa
(integer) 4
127.0.0.1:6379> lrange alist 0 10
1) "musql"
2) "mongodb"
3) "redis"
4) "aaa"


#3.在一个元素的前/后插入新元素
127.0.0.1:6379> linsert alist after aaa bbb
(integer) 5
127.0.0.1:6379> lrange alist 0 10
1) "musql"
2) "mongodb"
3) "redis"
4) "aaa"
5) "bbb"
127.0.0.1:6379> linsert alist before aaa ccc
(integer) 6
127.0.0.1:6379> lrange alist 0 10
1) "musql"
2) "mongodb"
3) "redis"
4) "ccc"
5) "aaa"
6) "bbb"


#4.设置指定索引的元素值,索引从0开始
127.0.0.1:6379> lset alist 3 bbb
OK
127.0.0.1:6379> lrange alist 0 10
1) "musql"
2) "mongodb"
3) "redis"
4) "bbb"
5) "aaa"
6) "bbb"

#注意:索引值可以是负数,表示偏移量是从list的尾部开始,如-1表示最后一个元素
3.2获取

演示:

#1.移除并返回key对应的list的第一个元素  
127.0.0.1:6379> lpop alist
"musql"

#2.移除并返回key对应的list的最后一个元素
127.0.0.1:6379> rpop alist
"bbb"

#3.返回存储在key的列表中的指定范围的元素
127.0.0.1:6379> lrange alist 0 10
1) "mongodb"
2) "redis"
3) "bbb"
4) "aaa"
#注意:start end都是从0开始
3.3其他

演示:

#1.裁剪列表,改为原集合的一个子集
127.0.0.1:6379> ltrim alist 0 2
OK
127.0.0.1:6379> lrange alist 0 10
1) "mongodb"
2) "redis"
3) "bbb"
#包头包尾

#2.返回存储在key里的list的长度
127.0.0.1:6379> llen alist
(integer) 3

#3.返回列表中索引对应的值  
127.0.0.1:6379> lindex alist 2
"bbb"

4.集合

Redis集合是唯一字符串的无序集合。 唯一值表示集合中不允许键中有重复的数据。

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

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

序号 命令 说明
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] 递增地迭代集合中的元素
4.1设置

演示:

#1.添加元素
redis 127.0.0.1:6379> sadd aset redis 
(integer) 1 
redis 127.0.0.1:6379> sadd aset mongodb 
(integer) 1 
redis 127.0.0.1:6379> sadd aset sqlite 
(integer) 1 
redis 127.0.0.1:6379> sadd aset sqlite 
(integer) 0 
redis 127.0.0.1:6379> smembers aset  

1) "sqlite" 
2) "mongodb" 
3) "redis"
#aset 为键
#注意 :如果被添加两次,但是由于集合的唯一属性,所以它只算添加一次。
4.2获取

演示:

#1.返回key集合中所有元素
redis 127.0.0.1:6379> smembers aset  

#2.返回集合元素个数
redis 127.0.0.1:6379> scard aset  
4.3交集

演示:

#1.求多个集合的交集  
127.0.0.1:6379> sadd aset1 aaa
(integer) 1
127.0.0.1:6379> sadd aset1 mysql
(integer) 1
127.0.0.1:6379> sadd aset1 bbbb
(integer) 1
127.0.0.1:6379> sinter aset aset1
1) "mysql"
2) "aaa"

#2.求多个集合的差集   
127.0.0.1:6379> sdiff aset aset1
1) "mongodb"
2) "redis"

#3.判断元素是否在集合中,存在返回1,不存在返回0
127.0.0.1:6379> sismember aset mysql
(integer) 1
4.4有序集合

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

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

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

下表列出了 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]迭代有序集合中的元素(包括元素成员和元素分值

演示:

a.添加

127.0.0.1:6379> zadd z1 1 a 3 b 4 c 5 d 2 e
(integer) 5

b.获取

#1.返回指定范围的元素
127.0.0.1:6379> zrange z1 1 3
1) "e"
2) "b"
3) "c"

#2.返回元素个数
127.0.0.1:6379> zcard z1
(integer) 5

#3.返回有序集合key中,score在min和max之间的元素的个数
127.0.0.1:6379> zcount z1 2 5
(integer) 4

#4.返回有序集合key中,成员member的score值
127.0.0.1:6379> zscore z1 b
"3"

五、与 python 交互

pip3 install redis

引入模块

from redis import StrictRedis

这个模块中提供了StrictRedis对象(Strict严格),用于连接redis服务器,并按照不同类型提供 了不同方法,进行交互操作

StrictRedis对象方法:

通过init创建对象,指定参数host、port与指定的服务器和端口连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0)

代码演示:

from redis import  *

# 创建一个StrictReids对象,与redis服务器建立连接
sr = StrictRedis(host='localhost', port=6379, db=0)

#1.增
try:
    
    result = sr.set('py1', 'gj')
    # result如果为true,则表示添加成功
    print(result)
except Exception as e:
    print(e)
    
#2.删
#result = sr.delete('py1')
#print(result)

#3.改
result = sr.set('py1','he')

#4.查
#如果建不存在,则返回None
result = sr.get('py1')

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

推荐阅读更多精彩内容