Redis

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"

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值