redis
1.NoSQL的引入
NoSQL并不是指NO SQL,而是指not only sql。为什么要使用nosql??
在之前的系统结构中,我们通过ngix负载均衡将数据分发到多个应用集群上,第一次登录时,我们在应用A有Session记录,当下一个请求到来时,负载均衡到应用B时,应用B没有Session记录,这样会出现问题。这时候引入nosql的作用,第一次登录的session直接缓存在nosql中,这样下次请求到来,直接看nosql是否有这个session记录就可以了。
2.redis的说明
默认路径:/usr/local/cib
redis-benchmark:性能测试工具
redis-check-aof:修复有问题的AOOF文件
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务启动命令
redis-cli:客户端,操作入口
3.单线程+多路复用
redis使用的是单线程多路复用的技术。举例:A、B、C、三个人想要买火车票,他们委托黄牛D去帮买票,就只有一个黄牛去买票这是单线程的意思,然后黄牛帮买A的火车票,A不用等待,只管做他的事情,B、C同理。
4.基本用法
查看数据库中所有内容:keys *
设置值: set
查看key值是否存在:exists
查看key是什么类型 : type
1》删除指定的key:del
2》删除指定的key(异步操作,先从元数据中将数据删除,真正的删除等后续的异步操作):unlink key
设置过期时间:expire
查看过期时间:ttl (-1 代表永不过期,-2代表已经过期)
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set aaa 111
OK
127.0.0.1:6379> set bbb 222
OK
127.0.0.1:6379> set ccc 333
OK
127.0.0.1:6379> keys *
1) "ccc"
2) "aaa"
3) "bbb"
127.0.0.1:6379> exists aaa
(integer) 1
127.0.0.1:6379> type aaa
string
127.0.0.1:6379> del aaa
(integer) 1
127.0.0.1:6379> keys *
1) "ccc"
2) "bbb"
127.0.0.1:6379> expire bbb 10
(integer) 1
127.0.0.1:6379> ttl bbb
(integer) 7
127.0.0.1:6379> ttl bbb
(integer) -2
127.0.0.1:6379>
5.String类型
在原来的数据上追加:append
查看key对应value的长度:strlen
127.0.0.1:6379> keys * 1) "ccc" 127.0.0.1:6379> append ccc ddd (integer) 6 127.0.0.1:6379> get ccc "333ddd" 127.0.0.1:6379> strlen ccc (integer) 6 127.0.0.1:6379> setnx aaa bbb (integer) 1 127.0.0.1:6379> keys * 1) "ccc" 2) "aaa"
自增加1:incr
减1:decr
增加步长:incrby
减少步长:decrby
127.0.0.1:6379> set bbb 111 OK 127.0.0.1:6379> incr bbb (integer) 112 127.0.0.1:6379> decr bbb (integer) 111
127.0.0.1:6379> incrby bbb 10
(integer) 121
127.0.0.1:6379> decrby bbb 40
(integer) 81
127.0.0.1:6379>
7. List
单键多值,他的底层是一个双向链表,可以添加一个元素到列表的左边或者是右边
lpush/rpush <key> <value1> <value2> ... 从左边/右边插入一个值或多个值
lpop/rpp <key> 从左边/右边吐出一个值。值在健在,值光键亡
rpoplpush <key1><key2> 从key1列表右边吐出一个值,插到key2列表左边
lrange<key> <start><stop> 按照索引下标获得元素(从左到右)
lindex<key><index> 按照索引下标获得元素 从左至右
llen<key> 获得列表长度
linsert <key> before <value> <newvalue> 在<value>前面插入<newvalue>值(可以用after)
lrem<key> <n> <value> 从左边删除n个value
lset<key> <index> <value> 将列表key下标为index的值替换成value
List数据结构为快速链表quickList
当元素较少时,会使用一块连续的内存存储,这个结构是ziplist。当数据量较大的时候才会改成快速链表。
8.set
Redis set对外提供的功能和list类似,特殊之处可以排重。
(1) 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
sadd <key><value1><value2> .....
(2) 取出该集合的所有值
smembers <key>
(3) 判断集合key是否为含有该value值,有1,没有0
sismember <key><value>
1
(4) 返回该集合的元素个数
scard<key>
(5) 删除集合中的某个元素
srem <key><value1><value2> ....
(6) 随机从该集合中吐出n个值
spop <key> [n]
(7) 随机从该集合中取出n个值,不会从集合中删除
srandmember <key> [n]
(8) 把集合中一个值从一个集合移动到另一个集合
smove <source> <destination> value
(9) 返回两个集合的交集元素
sinter <key1> <key2>
(10) 返回两个集合的并集元素
sunion <key1><key2>
(11) 返回两个集合的差集元素(key1中与key2不重复的value)
sdiff <key1><key2>
1
2.3.3 数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
https://blog.csdn.net/javahelpyou/article/details/123968215
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix