Python第三阶段学习redis day02
2021/7/10 19:10:17
本文主要是介绍Python第三阶段学习redis day02,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
redis_day02笔记
位图操作bitmap
定义
1、位图不是真正的数据类型,它是定义在字符串类型中 2、一个字符串类型的值最多能存储512M字节的内容,位上限:2^32 # 1MB = 1024KB # 1KB = 1024Byte(字节) # 1Byte = 8bit(位)
强势点
可以实时的进行统计,极其节省空间。官方在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”的时间消耗小于50ms, 占用16MB内存
SETBIT 命令
-
说明:设置某位置上的二进制值
-
语法:SETBIT key offset value
-
参数:offset - 偏移量 从0开始
value - 0或者1
-
示例:
# 默认扩展位以0填充 127.0.0.1:6379> SET mykey ab OK 127.0.0.1:6379> GET mykey "ab" 127.0.0.1:6379> SETBIT mykey 0 1 (integer) 0 127.0.0.1:6379> GET mykey "\xe1b" 127.0.0.1:6379>
GETBIT 命令
-
说明:获取某一位上的值
-
语法:GETBIT key offset
-
示例:
127.0.0.1:6379> GETBIT mykey 3 (integer) 0 127.0.0.1:6379> GETBIT mykey 0 (integer) 1 127.0.0.1:6379>
BITCOUNT 命令
- 说明:统计键所对应的值中有多少个 1
- 语法:BITCOUNT key start end
- 参数:start/end 代表的是 字节索引
- 示例:
127.0.0.1:6379> SET mykey1 ab OK 127.0.0.1:6379[4]> BITCOUNT mykey (integer) 6 127.0.0.1:6379[4]> BITCOUNT mykey 0 0 (integer) 3
应用场景案例
# 网站用户的上线次数统计(寻找活跃用户) 用户名为key,上线的天作为offset,上线设置为1 # 示例 用户名为 user1:login 的用户,今年第1天上线,第30天上线 SETBIT user1:login 0 1 SETBIT user1:login 29 1 BITCOUNT user1:login
Hash散列数据类型
- 定义
1、由field和关联的value组成的键值对 2、field和value是字符串类型 3、一个hash中最多包含2^32-1个键值对
- 优点
1、节约内存空间 - 特定条件下 【1,字段小于512个,2:value不能超过64字节】 2、可按需获取字段的值
- 缺点(不适合hash情况)
1,使用过期键功能:键过期功能只能对键进行过期操作,而不能对散列的字段进行过期操作 2,存储消耗大于字符串结构
- 基本命令操作
# 1、设置单个字段 HSET key field value HSETNX key field value # 2、设置多个字段 HMSET key field value field value # 3、返回字段个数 HLEN key # 4、判断字段是否存在(不存在返回0) HEXISTS key field # 5、返回字段值 HGET key field # 6、返回多个字段值 HMGET key field filed # 7、返回所有的键值对 HGETALL key # 8、返回所有字段名 HKEYS key # 9、返回所有值 HVALS key # 10、删除指定字段 HDEL key field # 11、在字段对应值上进行整数增量运算 HINCRBY key field increment # 12、在字段对应值上进行浮点数增量运算 HINCRBYFLOAT key field increment
python操作hash
# 1、更新一条数据的属性,没有则新建 hset(name, key, value) # 2、读取这条数据的指定属性, 返回字符串类型 hget(name, key) # 3、批量更新数据(没有则新建)属性,参数为字典 hmset(name, mapping) # 4、批量读取数据(没有则新建)属性 hmget(name, keys) # 5、获取这条数据的所有属性和对应的值,返回字典类型 hgetall(name) # 6、获取这条数据的所有属性名,返回列表类型 hkeys(name) # 7、删除这条数据的指定属性 hdel(name, *keys)
应用场景:用户维度数据统计
用户维度统计 统计数包括:关注数、粉丝数、喜欢商品数、发帖数 用户为key,不同维度为field,value为统计数 比如关注了5人 HSET user:10000 fans 5 HINCRBY user:10000 fans 1
python操作hash
import redis # 创建redis数据库的连接对象 r = redis.Redis(password='123456') # 操作hash r.hset('pyhk1', 'username', 'aid2102') r.hmset('pyhk1', {'age': 18, 'major': 'python'}) print(r.hget('pyhk1', 'username').decode()) print(r.hmget('pyhk1', ['username', 'age'])) print(r.hgetall('pyhk1')) # 字典推导式 data = {k.decode(): v.decode() for k, v in r.hgetall('pyhk1').items()} print(data) r.hdel('pyhk1','age') print(r.hgetall('pyhk1')) # 删除键 r.delete('pyhk1')
集合数据类型(set)
- 特点
1、无序、去重 2、元素是字符串类型 3、最多包含2^32-1个元素
- 基本命令
# 1、增加一个或者多个元素,自动去重;返回值为成功插入到集合的元素个数 SADD key member1 member2 # 2、查看集合中所有元素 SMEMBERS key # 3、删除一个或者多个元素,元素不存在自动忽略 SREM key member1 member2 # 4、元素是否存在 SISMEMBER key member # 5、随机返回集合中指定个数的元素,默认为1个 SRANDMEMBER key [count] # 6、弹出成员 SPOP key [count] # 7、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了 SCARD key # 8、把元素从源集合移动到目标集合 SMOVE source destination member # 9、差集(number1 1 2 3 number2 1 2 4 结果为3) SDIFF key1 key2 # 10、差集保存到另一个集合中 SDIFFSTORE destination key1 key2 # 11、交集 SINTER key1 key2 SINTERSTORE destination key1 key2 # 11、并集 SUNION key1 key2 SUNIONSTORE destination key1 key2
案例: 新浪微博的共同关注
# 需求: 当用户访问另一个用户的时候,会显示出两个用户共同关注过哪些相同的用户 # 设计: 将每个用户关注的用户放在集合中,求交集即可 # 实现: user001 = {'peiqi','qiaozhi','danni'} user002 = {'peiqi','qiaozhi','lingyang'} user001和user002的共同关注为: SINTER user001 user002 结果为: {'peiqi','qiaozhi'}
python操作set
import redis r = redis.Redis(password='123456') ''' 武将: 张飞 许褚 赵云 马超 周瑜 文臣: 诸葛亮 周瑜 司马懿 结果: 1.纯武将 2.纯文臣 3.文武双全 4.文臣武将 ''' # set集合类型的操作 r.sadd('武将', '张飞', '许褚', '赵云', '马超', '周瑜') r.sadd('文臣', '诸葛亮', '周瑜', '司马懿') data1 = r.sdiff('武将', '文臣') result = [] for item in data1: result.append(item.decode()) print('纯武将:', result) data2 = r.sdiff('文臣', '武将') result = [] for item in data2: result.append(item.decode()) print('纯文臣:', result) data3 = r.sinter('文臣', '武将') result = [] for item in data3: result.append(item.decode()) print('文武双全:', result) data4 = r.sunion('文臣', '武将') result = [] for item in data4: result.append(item.decode()) print('文臣武将:', result)
有序集合sortedset
- 特点
1、有序、去重 2、元素是字符串类型 3、每个元素都关联着一个浮点数分值(score),并按照分值从小到大的顺序排列集合中的元素(分值可以相同) 4、最多包含2^32-1元素
-
示例
一个保存了水果价格的有序集合
分值 | 2.0 | 4.0 | 6.0 | 8.0 | 10.0 |
---|---|---|---|---|---|
元素 | 西瓜 | 葡萄 | 芒果 | 香蕉 | 苹果 |
一个保存了员工薪水的有序集合
分值 | 6000 | 8000 | 10000 | 12000 | |
---|---|---|---|---|---|
元素 | lucy | tom | jim | jack |
一个保存了正在阅读某些技术书的人数
分值 | 300 | 400 | 555 | 666 | 777 |
---|---|---|---|---|---|
元素 | 核心编程 | 阿凡提 | 本拉登 | 阿姆斯特朗 | 比尔盖茨 |
- 有序集合常用命令
# 在有序集合中添加一个成员 返回值为 成功插入到集合中的元素个数 zadd key score member # 查看指定区间元素(升序) zrange key start stop [withscores] # 查看指定区间元素(降序) zrevrange key start stop [withscores] # 查看指定元素的分值 zscore key member # 返回指定区间元素 # offset : 跳过多少个元素 # count : 返回几个 # 小括号 : 开区间 zrangebyscore fruits (2.0 8.0 zrangebyscore key min max [withscores] [limit offset count] # 每页显示10个成员,显示第5页的成员信息: # limit 40 10 # MySQL: 每页显示10条记录,显示第5页的记录 # limit 40,10 # limit 2,3 显示: 第3 4 5条记录 # 删除成员 zrem key member # 增加或者减少分值 zincrby key increment member # 返回元素排名 zrank key member # 返回元素逆序排名 zrevrank key member # 删除指定区间内的元素 zremrangebyscore key min max # 返回集合中元素个数 zcard key # 返回指定范围中元素的个数 zcount key min max zcount salary 6000 8000 zcount salary (6000 8000# 6000<salary<=8000 zcount salary (6000 (8000#6000<salary<8000 # 并集 zunionstore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX] # zunionstore salary3 2 salary salary2 weights 1 0.5 AGGREGATE MAX # 2代表集合数量,weights之后 权重1给salary,权重0.5给salary2集合,算完权重之后执行聚合AGGREGATE # 交集:和并集类似,只取相同的元素 zinterstore destination numkeys key1 key2 weights weight AGGREGATE SUM(默认)|MIN|MAX
python操作sorted set
import redis r = redis.Redis(password='123456') # 有序集合类型的操作 r.zadd('pyzk1', {'tedu': 100, 'tedu2': 200}) print(r.zrange('pyzk1', 0, -1, withscores=True)) r.zadd('pyzk2', {'tedu2': 200, 'tedu3': 200}) # 并集运算 r.zunionstore('pyzk3',['pyzk1','pyzk2'],aggregate='sum') print(r.zrange('pyzk3', 0, -1, withscores=True)) # 并集运算(带权重) r.zunionstore('pyzk4',{'pyzk1':0.8,'pyzk2':0.2}, aggregate='sum') print(r.zrange('pyzk4', 0, -1, withscores=True))
这篇关于Python第三阶段学习redis day02的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-18Redis安装入门:新手必读指南
- 2024-11-08阿里云Redis项目实战入门教程
- 2024-11-08阿里云Redis资料:新手入门与初级使用指南
- 2024-11-08阿里云Redis教程:新手入门及实用指南
- 2024-11-07阿里云Redis学习入门:新手必读指南
- 2024-11-07阿里云Redis学习入门:从零开始的操作指南
- 2024-11-07阿里云Redis学习:初学者指南
- 2024-11-06阿里云Redis入门教程:轻松搭建与使用指南
- 2024-11-02Redis项目实战:新手入门教程
- 2024-10-22Redis入门教程:轻松掌握数据存储与操作