【redis使用场景】
1 #1 缓存系统:使用最广泛的就是缓存 2 3 #2 计数器:网站访问量,转发量,评论数(文章转发,商品销量,单线程模型,不会出现并发问题) 4 django--->并发操作数据库---》数据没有错乱--》mysql是一个服务---》支持并发访问的--》处理了并发安全的问题---》不需要我们从程序端考虑并发安全问题 5 redis--》没有锁--》不存在并发安全问题--》redis数据读写是单线程的 6 7 #3 消息队列:发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者) 8 IPC 进程间通信 9 具体到项目:遇到问题发通知 10 -1w个问题,都要发通知 11 -只要产生问题---》就把问题丢到消息队列中---》另一端起程序,发送消息 12 13 #4 排行榜:有序集合(阅读排行,点赞排行,推荐(销量高的,推荐)) 14 15 #5 社交网络:很多特效跟社交网络匹配,粉丝数,关注数 16 17 #6 实时系统:垃圾邮件处理系统,布隆过滤器
。
。
【通用命令】
redis-cli允许用户与redis进行交互
1 #1-keys 2 #打印出所有key 3 keys * 4 #打印出所有以he开头的key 5 keys he* 6 #打印出所有以he开头,第三个字母是h到l的范围 7 keys he[h-l] 8 #三位长度,以he开头,?表示任意一位 9 keys he? 10 #keys命令一般不在生产环境中使用,生产环境key很多,时间复杂度为o(n),用scan命令 11 12 13 #2-dbsize 计算key的总数 14 dbsize #redis内置了计数器,插入删除值该计数器会更改,所以可以在生产环境使用,时间复杂度是o(1) 15 16 17 #3-exists key 时间复杂度o(1) 18 #设置a 19 set a b 20 #查看a是否存在 21 exists a 22 (integer) 1 23 #存在返回1 不存在返回0 24 25 26 #4-del key 时间复杂度o(1) 27 删除成功返回1,key不存在返回0 28 29 30 #5-expire key seconds 时间复杂度o(1) 31 expire name 3 #3s 过期 32 ttl name #查看name还有多长时间过期 33 persist name #去掉name的过期时间 34 35 36 #6-type key 时间复杂度o(1) 37 type name #查看name类型,返回string 38 39 40 41 # 7 其他 42 info命令:内存,cpu,主从相关-->通过它来写redis服务监控 43 client list 正在连接的会话 44 client kill ip:端口 45 flushall 清空所有 46 flushdb 只清空当前库 47 select 数字 选择某个库 总共16个库 48 monitor 记录操作日志,夯住 49 50 ------------------------------------------------------------------------------------- 51 52 # 管理redis实例的web项目 53 https://gitee.com/bijingrui/repoll 54 https://gitee.com/dromara/mayfly-go 55 https://gitee.com/careyjike_173/redis_web_client 56 57 https://gitee.com/Alcex/QMySQLAdmin 58 https://gitee.com/CloudWise/OMP 59 https://gitee.com/lustlost/ubackup
。
。
【字符串类型】
1 #1---基本使用get,set,del 2 get name #时间复杂度 o(1) 3 set name lqz #时间复杂度 o(1) 4 del name #时间复杂度 o(1) 5 6 7 #2---其他使用incr,decr,incrby,decrby 8 incr age #对age这个key的value值自增1 9 decr age #对age这个key的value值自减1 10 incrby age 10 #对age这个key的value值增加10 11 decrby age 10 #对age这个key的value值减10 12 #统计网站访问量(单线程无竞争,天然适合做计数器) 13 #分布式id生成(多个机器同时并发着生成,不会重复) 14 15 16 17 #3---set,setnx,setxx 18 set name lqz #不管key是否存在,都设置 19 setnx name lqz #key不存在时才设置(新增操作) 20 set name lqz nx #同上 21 set name lqz xx #key存在,才设置(更新操作) 22 23 24 #4---mget mset 25 mget key1 key2 key3 #批量获取key1,key2.。。时间复杂度o(n) 26 mset key1 value1 key2 value2 key3 value3 #批量设置时间复杂度o(n) 27 #n次get和mget的区别 28 #n次get时间=n次命令时间+n次网络时间 29 #mget时间=1次网络时间+n次命令时间 30 31 #5---其他:getset,append,strlen 32 getset name lqznb #设置新值并返回旧值 时间复杂度o(1) 33 append name 666 #将value追加到旧的value 时间复杂度o(1) 34 strlen name #计算字符串长度(注意中文) 时间复杂度o(1) 35 36 #6---其他:incrybyfloat,getrange,setrange 37 increbyfloat age 3.5 #为age自增3.5,传负值表示自减 时间复杂度o(1) 38 getrange key start end #获取字符串制定下标所有的值 时间复杂度o(1) 39 setrange key index value #从指定index开始设置value值 时间复杂度o(1)
。
。
【hash类型】
1 #1---hget,hset,hdel 2 hget key field #获取hash key对应的field的value 时间复杂度为 o(1) 3 hset key field value #设置hash key对应的field的value值 时间复杂度为 o(1) 4 hdel key field #删除hash key对应的field的值 时间复杂度为 o(1) 5 6 #测试 7 hset user:1:info age 23 8 hget user:1:info age 9 hset user:1:info name lqz 10 hgetall user:1:info 11 hdel user:1:info age 12 13 #2---hexists,hlen 14 hexists key field #判断hash key 是否存在field 时间复杂度为 o(1) 15 hlen key #获取hash key field的数量 时间复杂度为 o(1) 16 hexists user:1:info name 17 hlen user:1:info #返回数量 18 19 #3---hmget,hmset 20 hmget key field1 field2 ...fieldN #批量获取hash key 的一批field对应的值 时间复杂度是o(n) 21 hmset key field1 value1 field2 value2 #批量设置hash key的一批field value 时间复杂度是o(n) 22 23 #4--hgetall,hvals,hkeys 24 hgetall key #返回hash key 对应的所有field和value 时间复杂度是o(n) 25 hvals key #返回hash key 对应的所有field的value 时间复杂度是o(n) 26 hkeys key #返回hash key对应的所有field 时间复杂度是o(n) 27 ###小心使用hgetall 28 ##1 计算网站每个用户主页的访问量 29 hincrby user:1:info pageview count 30 ##2 缓存mysql的信息,直接设置hash格式 31 32 #其他操作 hsetnx,hincrby,hincrbyfloat 33 hsetnx key field value #设置hash key对应field的value(如果field已存在,则失败),时间复杂度o(1) 34 hincrby key field intCounter #hash key 对英的field的value自增intCounter 时间复杂度o(1) 35 hincrbyfloat key field floatCounter #hincrby 浮点数 时间复杂度o(1)
。
。
【列表类型】
1 ###插入操作### 2 #rpush 从右侧插入 3 rpush key value1 value2 ...valueN #时间复杂度为o(1~n) 4 #lpush 从左侧插入 5 #linsert 6 linsert key before|after value newValue #从元素value的前或后插入newValue 时间复杂度o(n) ,需要遍历列表 7 linsert listkey before b java 8 linsert listkey after b php 9 10 11 ######删除操作######### 12 lpop key #从列表左侧弹出一个item 时间复杂度o(1) 13 14 rpop key #从列表右侧弹出一个item 时间复杂度o(1) 15 16 lrem key count value 17 #根据count值,从列表中删除所有value相同的项 时间复杂度o(n) 18 1 count>0 从左到右,删除最多count个value相等的项 19 2 count<0 从右向左,删除最多 Math.abs(count)个value相等的项 20 3 count=0 删除所有value相等的项 21 lrem listkey 0 a #删除列表中所有值a 22 lrem listkey -1 c #从右侧删除1个c 23 24 ltrim key start end #按照索引范围修剪列表 o(n) 25 ltrim listkey 1 4 #只保留下表1--4的元素 26 27 28 ############查询操作############ 29 lrange key start end #包含end获取列表指定索引范围所有item o(n) 30 lrange listkey 0 2 31 lrange listkey 1 -1 #获取第一个位置到倒数第一个位置的元素 32 33 lindex key index #获取列表指定索引的item o(n) 34 lindex listkey 0 35 lindex listkey -1 36 37 llen key #获取列表长度 38 ############修改操作############ 39 lset key index newValue #设置列表指定索引值为newValue o(n) 40 lset listkey 2 ppp #把第二个位置设为ppp 41 42 ############实战############ 43 实现timeLine功能,时间轴:微博关注的人,按时间轴排列,在列表中放入关注人的微博的即可 44 45 ############其他操作############ 46 blpop key timeout #lpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1) 47 brpop key timeout #rpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1) 48 49 #要实现栈的功能 50 lpush+lpop 51 #实现队列功能 52 lpush+rpop 53 #固定大小的列表 54 lpush+ltrim 55 #消息队列 56 lpush+brpop
。
。
【集合操作】
1 sadd key element #向集合key添加element(如果element存在,添加失败) o(1) 2 3 srem key element #从集合中的element移除掉 o(1) 4 5 scard key #计算集合大小 6 7 sismember key element #判断element是否在集合中 8 9 srandmember key count #从集合中随机取出count个元素,不会破坏集合中的元素 10 11 spop key #从集合中随机弹出一个元素 12 13 smembers key #获取集合中所有元素 ,无序,小心使用,会阻塞住 14 15 ##### 集合操作###### 16 sdiff user:1:follow user:2:follow #计算user:1:follow和user:2:follow的差集 17 18 sinter user:1:follow user:2:follow #计算user:1:follow和user:2:follow的交集 19 20 sunion user:1:follow user:2:follow #计算user:1:follow和user:2:follow的并集 21 22 sdiff|sinter|suion + store destkey... #将差集,交集,并集结果保存在destkey集合中 23 sdiffstore 另一个集合名字 boys girls 24 sinterstore 另一个集合名字 boys girls 25 26 27 28 ---------------- 集合可以做什么-------------------------- 29 30 1 抽奖系统 :通过spop来弹出用户的id,活动取消,直接删除 31 32 2 点赞,点踩,喜欢等,用户如果点了赞,就把用户id放到该条记录的集合中 33 34 3 标签:给用户/文章等添加标签,sadd user:1:tags 标签1 标签2 标签3 35 给标签添加用户,关注该标签的人有哪些 36 37 4 共同好友:集合间的操作 38 39 =========总结================ 40 sadd:可以做标签相关 41 42 spop/srandmember:可以做随机数相关 43 44 sadd/sinter:社交相关
。
。
【有序集合】
1 # 特点: 2 #有一个分值字段,来保证顺序 3 key score value 4 user:ranking 1 lqz 5 user:ranking 99 lqz2 6 user:ranking 88 lqz3 7 8 #集合有序集合 9 集合:无重复元素,无序,element 10 有序集合:无重复元素,有序,element+score 11 12 #列表和有序集合 13 列表:可以重复,有序,element 14 有序集合:无重复元素,有序,element+score 15 16 17 # API使用 18 zadd key score element #score可以重复,可以多个同时添加,element不能重复 o(logN) 19 20 zrem key element #删除元素,可以多个同时删除 o(1) 21 22 zscore key element #获取元素的分数 o(1) 23 24 zincrby key increScore element #增加或减少元素的分数 o(1) 25 26 zcard key #返回元素总个数 o(1) 27 28 zrank key element #返回element元素的排名(从小到大排) 29 30 zrange key 0 -1 #返回排名,不带分数 o(log(n)+m) n是元素个数,m是要获取的值 31 32 zrange player:rank 0 -1 withscores #返回排名,带分数 33 34 zrangebyscore key minScore maxScore #返回指定分数范围内的升序元素 o(log(n)+m) n是元素个数,m是要获取的值 35 36 zrangebyscore user:1:ranking 90 210 withscores #获取90分到210分的元素 37 38 zcount key minScore maxScore #返回有序集合内在指定分数范围内的个数 o(log(n)+m) 39 40 zremrangebyrank key start end #删除指定排名内的升序元素 o(log(n)+m) 41 42 zremrangebyrank user:1:rangking 1 2 #删除升序排名中1到2的元素 43 44 zremrangebyscore key minScore maxScore #删除指定分数内的升序元素 o(log(n)+m) 45 46 zremrangebyscore user:1:ranking 90 210 #删除分数90到210之间的元素 47 48 #应用场景 49 排行榜:音乐排行榜,销售榜,关注榜,游戏排行榜 50 51 ---------------------------------------------------- 52 # 其他操作 53 zrevrank #从高到低排序 54 zrevrange #从高到低排序取一定范围 55 zrevrangebyscore #返回指定分数范围内的降序元素 56 zinterstore #对两个有序集合交集 57 zunionstore #对两个有序集合求并集
分类:
redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗