Redis介绍
Redis是完全开源的,遵守BSD协议,它是一个基于内存,可持久化的NoSQL的数据库,不支持SQL语句,是key-value形式的高性能su数据库,redis理论读取的速度110000/秒,写的速度80000/秒
- 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型-Redis支持二进制案例的String,Lists,Headers,Set及Order Sets数据类型操作
- 原子-Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行,单个操作是原子性。多个操作也支持事务,即原子性,通过MULTI和EXCEL指令包起来。
- 丰富的特性-Redis还支持publish/subscrible,通知key过期等等特性
Redis可以用来做什么
- redis可以用来做缓存(网站打开时,不可能每次都去mysql数据库中读一次,需要把常用数据存入redis中,缓存起来,这样的,就可以去内存当中读取,速度就会非常快)
- 可以用来做消息队列(发送一次短信验证,10个人发,就会有9个人在等待)
- 验证码存放(图形验证码,短信验证码)
- 可以做商品排行数据(按商品的点击量,按商品的销售数量)
- 可以做购物车(可以存放到mysql,也可以存放到redis)
拓展 : 在计算中,读写速度排名
第一:cpu
第二:三级内存
第三:内存
第四:固态硬盘
第五:机械硬盘
redis安装
Redis支持32位和64位,这个需要根据你系统平台的实际情况选择,这里我们下载
Redis-x64-5.0.10msi 安装包到自己的电脑,然后安装即可
如果想方便的话,可以把redis的路径加到系统的环境变量里
Redis操作
Redis客户端的基本语法位:
redis-cli
Redis支持五种数据类型:
String(字符串)
Hash(哈希)
List(列表)
Set(集合)
zSet(sorted set:有序集合)
连接redis
import redis
# Redis实例化时,不填写参数,默认是本机,端口号默认6379,默认数据库为0
r = redis.Redis()
# 加参数 host是主机 port是端口号 db是数据库(0-15)
# 读取时响应内容编码格式:
decode_response = False,读取出来时bytes类型,需要转换
decode_response = True,为True时,读出来的时utf-8格式,不需要转换
r = redis.Redis(host='localhost',port=6379,db=8,decode_response=True)
String
增
set key val # 对一个键设置一个值
127.0.0.1:6379>set name xiaomi # 存储{"name":"小米"}
mset key1 val1 key2 key3... # 同时设置多个键值对
127.0.0.1:6379>mset name xiaomi age 23 gender man
# 存储{"name":"xiaomi","age":23,"gender":"man"}
append key val # 在在对应的值末尾追加新值,键不存在,相当于set添加
127.0.0.1:6379> append name 2 # 在xiaomi后面添加2
(integer) 7
set key valueEX seconds # 将值value关联到key,并将key的过期时间设置为seconds(以秒为单位)
127.0.0.1:6379>set flag 1 EX 5 #存储标志1的过期时间为5s
查
get key # 去除键对应的值
127.0.0.1:6379> get name
结果为:"xiaomi2"
mget key1 key2 key3 # 一次取出多个键对应的值
127.0.0.1:6379> mget name age gender
1) "xiaomi"
2) "23"
3) "man"
小结
1.存储本次生成的短信验证码,方便下次验证,注意:短信验证码的有效期为10分钟
127.0.0.1:6379>set sms_code_1731111111 637905 EX 600
# 存储 1731111111该手机号的短信验证码 637905,过期时间是10分钟
2.存储标志,防止短信验证码发送过于频繁,1分内只能发送一次
127.0.0.1:6379>set sms_code_flag_117311111111 EX 60
# 存储1731111111该手机号是否为发送短信验证码的标志,过期时间为60s
3.去除短信验证码
127.0.0.1:6379> get sms_code_1731111111 #取出短信验证码,过期后,取出(nil)"637905"
List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
增
["李家宝","吴俊希"]
# 头插法
lpush key val1 val2...
127.0.0.1:6379> lpush numbers 1 2 3
(integer) 3
# 尾插法
127.0.0.1:6379>rpush numbers 8 9 0
(integer) 6
改
# 修改特定下标的值
lset key index val
127.0.0.1:6379> lset numbers 5 10 # 注意:redis中下标也是从0开始
ok
删
# 头删法
lpop key
127.0.0.1:6379> lpop numbers
"3"
# 尾删法
rpop key
127.0.0.1:6379> rpop numbers
"10"
# 删除指定的值
lrem key count value
127.0.0.1:6379>lrem numbers 0 2 #删除所有值为2的元素
(integer) 4
127.0.0.1:6379>lrem numbers -2 1 # 从表尾开始删除2个值为1的元素
(integer) 2
127.0.0.1:6379> lrem numbers 2 1 # 从表头开始删除2个值为1的元素
(integer) 2
# 保留指定下标区间的值,删除其余的元素
ltrim key start stop
127.0.0.1:6379>ltrim numbers 2 5 # 保留下标为 2-5之间的所有元素
ok
查
lrange key start stop # 返回指定区间内的内容
127.0.0.1:6379> lrange numbers 0 -1
1) "3"
2) "2"
3) "1"
小结
1.将id为1的商品存入用户173的历史记录中
127.0.0.1:6379> lrem history_173 0 1 # 先移除 用户173历史记录中 所有id为1的商品记录
(integer) 0
127.0.0.1:6379> lpush history_173 1 # 将 id为1的商品存入 用户173的历史记录中
(integer) 1
127.0.0.1:6379> ltrim history_173 0 4 # 保留 历史记录中的前5条商品数据
OK
2.查询用户173的历史记录
127.0.0.1:6379> lrange history_173 0 -1 # 查询列表中的所有元素
1) "1"
Hash
Redis hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用户存储字典数据。
增 查
hset key fiels value [field2 value2] # 同时将多个field-value(域-值)对设置到哈希表key中;键和字段存在时,属于修改
127.0.0.1:6379>hset user_123 name xiaomi age 23 gender man
# 存入用户信息123的个人信息{"name":"xiaomi","age":23,"gender":"男"}
(integer) 3
hincrby key fieldn increment # 为哈希表key中的字段的整数值加上增量increment
127.0.0.1:6379> hincrby user_123 age 1 # 用户123的年龄加1岁
(integer) 24
查
hget key field # 获取在哈希表中指定的字段的值
127.0.0.1:6379> hget user_123 name
"xiaomi"
hgetall key # 获取在哈希表中指定key的所有字段和值
127.0.0.1:6379>hgetall user_123
1) "name"
2) "xiaomi"
3) "age"
4) "24"
5) "gender"
6) "man"
删
hdel key field1 [field2] # 删除一个或多个哈希表字段
127.0.0.1:6379> hdel user_123 gender # 用户123的性别
(integer) 1
小结
1.新增id为5的5个商品到用户123的购物车中
127.0.0.1:6379> hincrby carts_123 3 5 # 假如购物车中原商品数量为1,新增之后为 6
(integer) 5
2.修改用户123的购物车中id为3的数量为5个
127.0.0.1:6379> hset carts_123 3 5 # 假如原数量为1,修改就是 5
(integer) 1
3.获取用户123的所有购物车数据
127.0.0.1:6379> hgetall carts_123
1) "3" # 商品id为3
2) "5" # 5个商品
4.删除用户123的购物车中id为3的商品
127.0.0.1:6379> hdel carts_123 3
(integer) 1
Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
增
sadd key member1 [member2] # 向集合添加一个或多个成员
删
srem key member1 [member2] # 移除集合中一个或多个成员
查
scard key # 获取集合的成员数
smembers key # 返回集合中的所有成员
小结
1.选中用户123购物车中id为3的商品
127.0.0.1:6379> sadd selected_123 3
(integer) 1
2.取消选中用户123 购物车中id为3的商品
127.0.0.1:6379> srem selected_123 3
(integer) 1
3.查询用户123购物车中所有选中的商品
127.0.0.1:6379> smembers selected_123
1) "3"
4.查询用户123购物车中所有选中的商品个数
127.0.0.1:6379> scard selected_123
(integer) 1
Zset
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
增
zadd key score1 member1 [score2 member2] # 向有序集合添加一个或多个成员,或者更新已存在成员的分数
127.0.0.1:6379> zadd salary 10000 Jim 8000 Tom 12000 JiMi 10000 Hake
(integer) 1
删
zrem key member [member ...] # 移除有序集合中的一个或多个成员
127.0.0.1:6379> zrem salary Hake # 删除员工Hake
(integer) 1
zremrangebyrank key start stop # 移除有序集合中给定的排名区间的所有成员
zremrangebyscore key min max # 移除有序集合中给定的分数区间的所有成员
改
zincrby key increment member # 有序集合中对指定成员的分数加上增量 increment
127.0.0.1:6379> zincrby salary 300 Jim # 给员工Jim涨300元薪资
"10300"
查
zcaed key # 获取有序集合的成员数
127.0.0.1:6379> zcard salary # 查询所有员工的数量
(integer) 4
zcount key min max # 计算在有序集合中指定区间分数的成员数
127.0.0.1:6379> zcount salary (8000 10000 # 统计所有符合条件 8000 < score <= 10000 的成员数量
(integer) 0
zrank key member # 返回有序集合中指定成员的索引
127.0.0.1:6379> zrank salary Tom # 升序排序中,Tom薪资的排名,分数值最大的成员排名为 0
(integer) 0
zrevrank key member # 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
127.0.0.1:6379> zrevrank salary Tom # 降序排序中,Tom薪资的排名
(integer) 2
zscore key member # 返回有序集中,成员的分数值
127.0.0.1:6379> zscore salary Tom # 查询Tom的薪资
"8000"
zrange key start stop [WITHSCORES] # 通过索引区间返回有序集合指定区间内的成员
127.0.0.1:6379> zrange salary 0 -1 # 查询所有的员工
1) "Tom"
2) "Jim"
127.0.0.1:6379> zrange salary 0 -1 withscores # 查询所有员工以及对应得薪资
1) "Tom"
2) "8000"
3) "Jim"
4) "10300"
zrevrange key start stop [WITHSCORES] # 返回有序集中指定区间内的成员,通过索引,分数从高到低
127.0.0.1:6379> zrevrange salary 0 -1 # 查询所有的员工,按照薪资降序展示
1) "JiMi"
2) "Jim"
3) "Tom"
127.0.0.1:6379> zrevrange salary 0 -1 withscores # 查询所有员工以及对应得薪资,按照薪资降序展示
1) "JiMi"
2) "12000"
3) "Jim"
4) "10300"
5) "Tom"
6) "8000"
zrangebyscore key min max [WITHSCORES] [LIMIT] # 通过分数返回有序集合指定区间内的成员
127.0.0.1:6379> zrangebyscore salary 8000 20000 # 查询 薪资在8000到20000之间的所有员工
1) "Tom"
2) "Hake"
3) "Jim"
4) "JiMi"
127.0.0.1:6379> zrangebyscore salary 8000 20000 limit 2 1 withscores #查询 薪资在8000到20000之间的所有员工以及对应的薪资,并对结果分页,每页显示1条数据,第3页
1) "Jim"
2) "10300"
zrevrangebyscore key max min [withscores] # 返回有序集中指定分数区间内的成员,分数从高到低排序
127.0.0.1:6379> zrevrangebyscore salary 20000 8000 # 查询 薪资在8000到20000之间的所有员工,按照薪资降序展示
1) "JiMi"
2) "Jim"
3) "Tom"
127.0.0.1:6379> zrevrangebyscore salary 20000 8000 limit 2 1 withscores #查询薪资在8000到20000之间的所有员工以及对应的薪资,按照薪资降序展示,并对结果分页,每页显示1条数据,第3页
1) "Tom"
2) "8000"
小结
1.存储所有学生的成绩
127.0.0.1:6379> zadd score_sheet 30 xiaomi 40 dami 100 mingming 87 lili
(integer) 4
2.查询成绩在不及格的学生以及成绩
127.0.0.1:6379> zrangebyscore score_sheet 0 (60 withscores # 成绩在 0到 60以下,不包含60
1) "xiaomi"
2) "30"
3) "dami"
4) "40"
3.查询成绩几个的学生数量
127.0.0.1:6379> zcount score_sheet 60 100
(integer) 3
4.查询xiaomi的成绩排名
127.0.0.1:6379> ZREVRANK score_sheet xiaomi
(integer) 4
5.查询所有学生以及成绩,降序展示
127.0.0.1:6379> zrevrange score_sheet 0 -1 withscores
1) "mingming"
2) "100"
3) "lili"
4) "87"
5) "liqiang"
6) "60"
7) "dami"
8) "40"
9) "xiaomi"
10) "30"