redis基础与进阶(二)

server/2024/10/18 7:44:44/

redis_0">一、redis数据类型

1.1 list(数组)

  • 队列,列表的子成员类型为string

lpush key value
rpush key value
linsert key after|before 指定元素 value
lindex key index
lrange key start stop
lset key index value
lrem key count value

1.1.1 添加子成员

# 在左侧(前)添加一条或多条数据
lpush key value1 value2 ...
# 在右侧(后)添加一条或多条数据
rpush key value1 value2 ...# 在指定元素的左边(前)/右边(后)插入一个或多个数据
linsert key before 指定元素 value1 value2 ....
linsert key after 指定元素 value1 value2 ....

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
linsert根据已有的元素去添加,如果有相同元素(zhangsan),从左到右找第一个zhangsan匹配
在这里插入图片描述

  • 从键为brother的列表左侧添加一个或多个数据liubei、guanyu、zhangfei
lpush brother liubei
# [liubei]
lpush brother guanyu zhangfei xiaoming
# [xiaoming,zhangfei,guanyu,liubei]
  • 从键为brother的列表右侧添加一个或多个数据,xiaohong,xiaobai,xiaohui
rpush brother xiaohong
# [xiaoming,zhangfei,guanyu,liubei,xiaohong]
rpush brother xiaobai xiaohui
# [xiaoming,zhangfei,guanyu,liubei,xiaohong,xiaobai,xiaohui]
  • 从key=brother的xiaohong的列表位置左侧添加一个数据,xiaoA,xiaoB
linsert brother before xiaohong xiaoA
# [xiaoming,zhangfei,guanyu,liubei,xiaoA,xiaohong,xiaobai,xiaohui]
linsert brother before xiaohong xiaoB
# [xiaoming,zhangfei,guanyu,liubei,xiaoA,xiaoB,xiaohong,xiaobai,xiaohui]
  • 从key=brother,key=xiaohong的列表位置右侧添加一个数据,xiaoC,xiaoD
linsert brother after xiaohong xiaoC
# [xiaoming,zhangfei,guanyu,liubei,xiaoA,xiaohong,xiaoC,xiaobai,xiaohui]
linsert brother after xiaohong xiaoD
# [xiaoming,zhangfei,guanyu,liubei,xiaoA,xiaohong,xiaoD,xiaoC,xiaobai,xiaohui]

注意:当列表如果存在多个成员值一致的情况下,默认只识别第一个。

127.0.0.1:6379> linsert brother before xiaoA xiaohong
# [xiaoming,zhangfei,guanyu,liubei,xiaohong,xiaoA,xiaohong,xiaoD,xiaoC,xiaobai,xiaohui]
127.0.0.1:6379> linsert brother before xiaohong xiaoE
# [xiaoming,zhangfei,guanyu,liubei,xiaoE,xiaohong,xiaoA,xiaohong,xiaoD,xiaoC,xiaobai,xiaohui]
127.0.0.1:6379> linsert brother after xiaohong xiaoF
# [xiaoming,zhangfei,guanyu,liubei,xiaoE,xiaohong,xiaoF,xiaoA,xiaohong,xiaoD,xiaoC,xiaobai,xiaohui]

1.1.2 基于索引获取列表成员

  • 根据指定的索引(下标)获取成员的值,负数下标从右边-1开始,逐个递减
lindex key index
  • 获取brother下标为2以及-2的成员
del brother
lpush brother guanyu zhangfei xiaoming
lindex brother 2
# "guanyu"
lindex brother -2
# "zhangfei"

在这里插入图片描述

1.1.3 获取列表的切片

  • 闭区间[包括stop]
lrange key start stop

操作:

del brother
rpush brother liubei guanyu zhangfei xiaoming xaiohong
# 获取btother的全部成员
lrange brother 0 -1
# 获取brother的前2个成员
lrange brother 0 1
# 获取brother的后2个成员
lrange brother -2 -1

在这里插入图片描述

1.1.4 获取列表的长度

llen key
  • 获取brother列表的成员个数
llen brother

在这里插入图片描述

1.1.5 按索引设置值

lset key index value
# 注意:
# redis的列表也有索引,从左往右,从0开始,逐一递增,第1个元素下标为0
# 索引可以是负数,表示尾部开始计数,如`-1`表示最后1个元素

修改键为brother的列表中下标为4的元素值为xiaohongmao

lset brother 4 xiaohonghong

在这里插入图片描述

1.1.6 删除指定成员

  • 移除并获取列表的第一个成员或最后一个成员。lpop删除按照索引删除
lpop key  # 第一个成员出列
rpop key  # 最后一个成员出列
  • 获取并移除brother中的第一个成员
lpop brother
# 开发中往往使用rpush和lpop实现队列的数据结构->`实现入列和出列(先入先出)`

在这里插入图片描述

  • lrem删除方法—按照元素内容删除
lrem key count value# 注意:
# count表示删除的数量,value表示要删除的成员。该命令默认表示将列表从左侧前count个value的元素移除
# count==0,表示删除列表所有值为value的成员
# count >0,表示删除列表左侧开始的前count个value成员
# count <0,表示删除列表右侧开始的前count个value成员del brother
rpush brother A B A C A
lrem brother 0 A
["B","C"]del brother
rpush brother A B A C A
lrem brother -2 A
["A","B","C"]del brother
rpush brother A B A C A
lrem brother 2 A
["B","C","A"]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 hash(哈希)

redis = {"info":{"name":"rain""age":22}
}
对应的值不是普通值而是字典值。"name""age"着两个键是属于哈希值的键,"info"键是属于redis的键
结构:
键key:{域field: 值value,(字段值)域field: 值value,域field: 值value,
}

hset key field value
hget key field
hgetall info
hmget key field1 field2 …
hincrby key field number

专门用于结构化的数据信息。对应的就是map/结构体

1.2.1 设置指定键的属性/域

  • 设置指定键的单个属性。
hset key field value

在这里插入图片描述

  • 设置键 user_1的属性name为`xiaoming
127.0.0.1:6379> hset user_1 name xiaoming   # user_1没有会自动创建
(integer) 1
127.0.0.1:6379> hset user_1 name xiaohei    # user_1中重复的属性会被修改
(integer) 0
127.0.0.1:6379> hset user_1 age 16          # user_1中不存在的属性会被新增
(integer) 1
127.0.0.1:6379> hset user:1 name xiaohui    # user:1会在redis界面操作中以:作为目录分隔符
(integer) 1
127.0.0.1:6379> hset user:1 age 15
(integer) 1
127.0.0.1:6379> hset user:2 name xiaohong age 16  # 一次性添加或修改多个属性

1.2.2 获取指定键的域/属性的值

  • 获取指定键所有的域/属性
hkeys key

在这里插入图片描述

  • 获取键user的所有域/属性
127.0.0.1:6379> hkeys user:2
1) "name"
2) "age"
127.0.0.1:6379> hkeys user:3
1) "name"
2) "age"
3) "sex"
  • 获取指定键的单个域/属性的值
hget key field
  • 获取键user:3属性name的值
127.0.0.1:6379> hget user:3 name
"xiaohong"
  • 获取指定键的多个域/属性的值-----这个方法处于hgethgetall中间---->hmget
hmget key field1 field2 ...

在这里插入图片描述

  • 获取指定键的多个域/属性的值
hmget key field1 field2 ...
  • 获取键user:2属性nameage的值
127.0.0.1:6379> hmget user:2 name age
1) "xiaohong"
2) "16"
  • 获取指定键的所有值
hvals key

在这里插入图片描述

  • 获取指定键的所有域值对
127.0.0.1:6379> hvals user:3
1) "xiaohong"
2) "17"
3) "1"

1.2.3 获取hash的所有域值对

127.0.0.1:6379> hset user:1 name xiaoming age 16 sex 1
(integer) 3
127.0.0.1:6379> hgetall user:1
1) "name"
2) "xiaoming"
3) "age"
4) "16"
5) "sex"
6) "1"

1.2.4 删除指定键的域/属性

hdel key field1 field2 ...

在这里插入图片描述

  • 删除键user:3的属性sex/age/name,当键中的hash数据没有任何属性,则当前键会被redis删除
hdel user:3 sex age name

1.2.5 判断指定属性/域是否存在于当前键对应的hash中

hexists   key  field

在这里插入图片描述

  • 判断user:2中是否存在age属性
127.0.0.1:6379> hexists user:3 age
(integer) 0
127.0.0.1:6379> hexists user:2 age
(integer) 1
127.0.0.1:6379> 

1.2.6 属性值自增自减

hincrby key field number
  • 自加1hincr,自加多------hincrby
    在这里插入图片描述
  • 给user:2的age属性在原值基础上+/-10,然后在age现有值的基础上-2
# 按指定数值自增
127.0.0.1:6379> hincrby user:2 age 10
(integer) 77
127.0.0.1:6379> hincrby user:2 age 10
(integer) 87# 按指定数值自减
127.0.0.1:6379> hincrby user:2 age -10
(integer) 77
127.0.0.1:6379> hincrby user:2 age -10

1.3 set(集合)

无序集合,重点就是去重无序

1.3.1 添加元素

sadd key member1 member2 ...
  • 向键authors的集合中添加元素zhangsanlisiwangwu
sadd authors zhangsan lisi wangwu

1.3.2 获取集合的所有的成员

smembers key
  • 获取键authors的集合中所有元素
smembers authors

在这里插入图片描述

1.3.3 获取集合的长度

scard keys 

在这里插入图片描述

  • 获取s2集合的长度
sadd s2 a b c d e127.0.0.1:6379> scard s2
(integer) 5

1.3.4 随机抽取一个或多个元素

  • 抽取出来的成员被删除掉
spop key [count=1]# 注意:
# count为可选参数,不填则默认一个。被提取成员会从集合中被删除掉

在这里插入图片描述

  • 随机获取s2集合的成员
sadd s2 a c d e127.0.0.1:6379> spop s2 
"d"
127.0.0.1:6379> spop s2 
"c"

1.3.5 删除指定元素

srem key value

在这里插入图片描述

  • 删除键authors的集合中元素wangwu
srem authors wangwu

1.3.6 交集、差集和并集

推荐、(协同过滤,基于用户、基于物品)

sinter  key1 key2 key3 ....    # 交集、比较多个集合中共同存在的成员
sdiff   key1 key2 key3 ....    # 差集、比较多个集合中不同的成员
sunion  key1 key2 key3 ....    # 并集、合并所有集合的成员,并去重

在这里插入图片描述

del user:1 user:2 user:3 user:4
sadd user:1 1 2 3 4     # user:1 = {1,2,3,4}
sadd user:2 1 3 4 5     # user:2 = {1,3,4,5}
sadd user:3 1 3 5 6     # user:3 = {1,3,5,6}
sadd user:4 2 3 4       # user:4 = {2,3,4}# 交集
127.0.0.1:6379> sinter user:1 user:2
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> sinter user:1 user:3
1) "1"
2) "3"
127.0.0.1:6379> sinter user:1 user:4
1) "2"
2) "3"
3) "4"127.0.0.1:6379> sinter user:2 user:4
1) "3"
2) "4"# 并集
127.0.0.1:6379> sunion user:1 user:2 user:4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"# 差集
127.0.0.1:6379> sdiff user:2 user:3
1) "4"  # 此时可以给user:3推荐4127.0.0.1:6379> sdiff user:3 user:2
1) "6"  # 此时可以给user:2推荐6127.0.0.1:6379> sdiff user:1 user:3
1) "2"
2) "4"

在这里插入图片描述
在这里插入图片描述

1.4 zset(有序集合)

有序集合(score/value),去重并且根据score权重值来进行排序的。score从小到大排列。每一个value都带着一个自身的权重值

1.4.1 添加成员

zadd key score1 member1 score2 member2 score3 member3 ....
# score必须是数字,数字是成员(member)的权重,是一对
  • 设置榜单achievements,设置成绩和用户名作为achievements的成员
127.0.0.1:6379> zadd achievements 61 xiaoming 62 xiaohong 83 xiaobai  78 xiaohei 87 xiaohui 99 xiaolan    # xiaoming成绩61分
(integer) 6
127.0.0.1:6379> zadd achievements 85 xiaohuang 
(integer) 1
127.0.0.1:6379> zadd achievements 54 xiaoqing

在这里插入图片描述

1.4.2 获取score在指定区间的所有成员

zrangebyscore key min max     # 按score进行从低往高排序获取指定score区间
zrevrangebyscore key max min  # 按score进行从高往低排序获取指定score区间
zrange key start stop         # 按scoer进行从低往高排序获取指定索引区间
zrevrange key start stop      # 按scoer进行从高往低排序获取指定索引区间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4.3 获取集合长度

zcard key
  • 获取users的长度
zcard achievements

在这里插入图片描述

1.4.4 获取指定成员的权重值

zscore key member
  • 获取users中xiaoming的成绩
127.0.0.1:6379> zscore achievements xiaobai
"93"
127.0.0.1:6379> zscore achievements xiaohong
"62"
127.0.0.1:6379> zscore achievements xiaoming
"61"

在这里插入图片描述

1.4.5 获取指定成员在集合中的排名

  • 排名从0开始计算
zrank key member      # score从小到大的排名
zrevrank key member   # score从大到小的排名

在这里插入图片描述

  • 获取achievements中xiaohei的分数排名,从大到小
127.0.0.1:6379> zrevrank achievements xiaohei
(integer) 4

1.4.6 获取score在指定区间的所有成员数量

zcount key min max

在这里插入图片描述

  • 获取achievements从0~60分之间的人数[闭区间]
127.0.0.1:6379> zcount achievements 0 60
(integer) 2
127.0.0.1:6379> zcount achievements 54 60
(integer) 2

1.4.7 给指定成员增加增加权重值

zincrby key score member

在这里插入图片描述

1.4.8 删除成员

zrem key member1 member2 member3 ....
  • 从achievements中删除xiaoming的数据
zrem achievements xiaoming

在这里插入图片描述

1.4.9 删除指定数量的成员

# 删除指定数量的成员,从最低score开始删除
zpopmin key [count]
# 删除指定数量的成员,从最高score开始删除
zpopmax key [count]

在这里插入图片描述
例子:

# 从achievements中提取并删除成绩最低的2个数据
127.0.0.1:6379> zpopmin achievements 2
1) "xiaoqing"
2) "54"
3) "xiaolv"
4) "60"# 从achievements中提取并删除成绩最高的2个数据
127.0.0.1:6379> zpopmax achievements 2
1) "xiaolan"
2) "99"
3) "xiaobai"
4) "93"

redis_533">二、Python操作redis

pythonredis_534">2.1 pythonredis基本操作

redis_535">2.1.1 连接redis

python"># 方式1
import redisr = redis.Redis(host='xxx.x.x.1', port=6379)
r.set('foo', 'Bar')
print(r.get('foo'))# 方式2
import redispool = redis.ConnectionPool(host='xxx.x.x.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('bar', 'Foo')
print(r.get('bar'))

通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响。于是, 连接池就发挥作用了。连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作。这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能。

2.1.2 数据类型操作

python">import redispool = redis.ConnectionPool(host='xxx.x.x.1', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)# (1)字符串操作:不允许对已经存在的键设置值
ret = r.setnx("name", "yuan")
print(ret)  # False
# (2)字符串操作:设置键有效期
r.setex("good_1001", 10, "2")
# (3)字符串操作:自增自减
r.set("age", 20)
r.incrby("age", 2)
print(r.get("age"))  # b'22'# (4)hash操作:设置hash
r.hset("info", "name", "rain")
print(r.hget("info", "name"))  # b'rain'
r.hmset("info", {"gedner": "male", "age": 22})
print(r.hgetall("info"))  # {b'name': b'rain', b'gender': b'male', b'age': b'22'}# (5)list操作:设置list
r.rpush("scores", "100", "90", "80")
r.rpush("scores", "70")
r.lpush("scores", "120")
print(r.lrange("scores", 0, -1))  # ['120', '100', '90', '80', '70']
r.linsert("scores", "AFTER", "100", 95)
print(r.lrange("scores", 0, -1))  # ['120', '100', '95', '90', '80', '70']
print(r.lpop("scores"))  # 120
print(r.rpop("scores"))  # 70
print(r.lindex("scores", 1)) # '95'# (6)集合操作
# key对应的集合中添加元素
r.sadd("name_set", "zhangsan", "lisi", "wangwu")
# 获取key对应的集合的所有成员
print(r.smembers("name_set"))  # {'lisi', 'zhangsan', 'wangwu'}
# 从key对应的集合中随机获取 numbers 个元素
print(r.srandmember("name_set", 2))
r.srem("name_set", "lisi")
print(r.smembers("name_set"))  # {'wangwu', 'zhangsan'}# (7)有序集合操作
# 在key对应的有序集合中添加元素
r.zadd("jifenbang", {"yuan": 78, "rain": 20, "alvin": 89, "eric": 45})
# 按照索引范围获取key对应的有序集合的元素
# zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
print(r.zrange("jifenbang", 0, -1))  # ['rain', 'eric', 'yuan', 'alvin']
print(r.zrange("jifenbang", 0, -1, withscores=True))  # ['rain', 'eric', 'yuan', 'alvin']
print(r.zrevrange("jifenbang", 0, -1, withscores=True))  # ['rain', 'eric', 'yuan', 'alvin']print(r.zrangebyscore("jifenbang", 0, 100))
print(r.zrangebyscore("jifenbang", 0, 100, start=0, num=1))# 删除key对应的有序集合中值是values的成员
print(r.zrem("jifenbang", "yuan"))  # 删除成功返回1
print(r.zrange("jifenbang", 0, -1))  # ['rain', 'eric', 'alvin']# (8)键操作
r.delete("scores")
print(r.exists("scores"))
print(r.keys("*"))
r.expire("name",10)

http://www.ppmy.cn/server/105436.html

相关文章

STM32常用C语言知识总结

目录 一、引言 二、C 语言基础 1.数据类型 2.变量与常量 3.控制结构 4.数组与指针 5.字符串 6. extern变量声明 7.内存管理 三、STM32 中的 C 语言特性 1.位操作 2.寄存器操作 一、引言 STM32 作为一款广泛应用的微控制器&#xff0c;其开发离不开 C 语言的支持。C …

做项目过程中问题小汇总 | vue3 elementplus js

el-card去除阴影 <el-card style"box-shadow: none;"> </el-card>el-button按钮加图标 <el-button type"primary" size"default" icon"Plus"click"addRole">添加职位</el-button>el-table表头的文…

一题看 无记忆化dfs、记忆化dfs和dp直接的转化

无记忆化dfs&#xff1a; class Solution { public:bool resfalse;bool wordBreak(string s, vector<string>& wordDict) {set<string> S;int ns.size();for(auto ss:wordDict){S.insert(ss);}function<void(int)> dfs[&](int t){if(restrue) retur…

【论文阅读】APMSA: Adversarial Perturbation Against Model Stealing Attacks(2023)

摘要 Training a Deep Learning (DL) model(训练深度学习模型) requires proprietary data(专有数据) and computing-intensive resources(计算密集型资源). To recoup their training costs(收回训练成本), a model provider can monetize DL models through Machine…

GATK AlleleList接口介绍

在 GATK&#xff08;Genome Analysis Toolkit&#xff09;中&#xff0c;AlleleList 接口是一个用来表示等位基因&#xff08;alleles&#xff09;列表的接口。Allele 是遗传学中用于表示某一特定基因座的不同形式的一个基本单位。AlleleList 接口定义了一些操作&#xff0c;使…

R语言function快速掌握-自定义函数

R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作&#xff0c;但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。 在R语言中&#xff0c;function 是一个核心概念&#xff0c;它允许用户创建可重用的代码块来执行特定的…

K8S基础和安装

一 、Kubernetes 概述 k8s用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统&#xff0c;可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群&#xff0c;是一个生态极其丰富的容器编排…

集合及数据结构第四节————List与顺序表

系列文章目录 集合及数据结构第四节————List、ArrayList与顺序表 List、ArrayList与顺序表 List的介绍常见接口介绍.List的使用什么是线性表顺序表接口的定义MyArrayList类里面实现这些接口&#xff08;&#xff09;功能顺序表的优缺点 文章目录 系列文章目录集合及数据…