官方文档:
全文翻译:
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库
、缓存
和消息中间件
。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
1、keys * #查看所有key
2、set key value #设置一个key-value
3、EXISTS key #判断当前的key是否存在
4、move key 1 #移动当前key到哪个数据库
5、EXPIRE key 时间 #设置当前key的过期时间,单位:秒
6、ttl key #查看当前key的剩余时间
7、get key #获得当前key的值
8、type key #查看当前key的类型
9、del key #移除当前key
127.0.0.1:6379> keys * #查看所有key
(empty list or set)
127.0.0.1:6379> set name achang #设置一个key
OK
127.0.0.1:6379> keys *
- “name”
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
-
“age”
-
“name”
127.0.0.1:6379> EXISTS age #判断当前的key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1 #移除当前key
(integer) 1
127.0.0.1:6379> keys *
- “age”
127.0.0.1:6379> clear
127.0.0.1:6379> set name achang
OK
127.0.0.1:6379> keys *
-
“name”
-
“age”
127.0.0.1:6379> get name
“achang”
127.0.0.1:6379> get age
“1”
127.0.0.1:6379> EXPIRE name 10 #设置当前key的过期时间,单位:秒
(integer) 1
127.0.0.1:6379> ttl name #查看当前key的剩余时间
(integer) 3
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name #获得当前key的值
(nil)
127.0.0.1:6379> type name #查看当前key的类型
string
127.0.0.1:6379> type age
string
127.0.0.1:6379> del age #移除当前key
(integer) 1
官网查看命令:
90%的java程序员使用redis只会使用一个String类型
127.0.0.1:6379> append age hello #给当前key追加内容,如果key不存在,就相当于setkey
(integer) 6
127.0.0.1:6379> keys * #获取所有的key
-
“age”
-
“name”
127.0.0.1:6379> get age
“1hello”
127.0.0.1:6379> STRLEN age #当前key的长度
(integer) 6
127.0.0.1:6379> STRLEN name
(integer) 6
127.0.0.1:6379> get name
“achang”
127.0.0.1:6379> clear
.
i++命令:
decr key #key值-1
incr key #key值+1
INCRBY key 10 #key值+设置的步长,
DECRBY key 10 #key值-设置的步长
127.0.0.1:6379> decr view #key值-1
(integer) 25
127.0.0.1:6379> incr view #key值+1
(integer) 26
127.0.0.1:6379> INCRBY view 10 #key值+设置的步长
(integer) 106
127.0.0.1:6379> DECRBY view 10 #key值-设置的步长
(integer) 96
.
字符串范围:
GETRANGE key start end #截取key从start开始,end结束的字符串值
SETRANGE key offset value #替换key从offset开始的值为value
#字符串范围 range
127.0.0.1:6379> set key1 hello,achang #设置key1的值
OK
127.0.0.1:6379> get key1 #获取key1的值
“hello,achang”
127.0.0.1:6379> GETRANGE key1 0 4 #截取字符串[0,4]
“hello”
127.0.0.1:6379> GETRANGE key1 0 -1 #截取字符串[0,-1]相当于获取全部
“hello,achang”
#替换
127.0.0.1:6379> set key2 abcdefg #设置key2的值
OK
127.0.0.1:6379> get key2 #获取key2的值
“abcdefg”
127.0.0.1:6379> SETRANGE key2 1 2 #替换key2指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
“a2cdefg”
原子设置值:
setex (set with expire) # 设置过期时间
setnx (set if not expire) #不存在在设置,存在就创建失败 (分布式锁中常常使用)
127.0.0.1:6379> setex key3 30 3033 #只是key3值为3033,30秒后过期
OK
127.0.0.1:6379> ttl key3 #查看key3剩余时间
(integer) 27
127.0.0.1:6379> get key3 #获取key3的值
“3033”
127.0.0.1:6379> setnx mykey redis #如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
-
“key1”
-
“mykey”
-
“key2”
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey mongoDb #如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
“redis”
.
批量获取和设置:
mset k1 v1 [k2 v2…] #批量设置key
mget k1 [k2 K2…] #批量获取key
msetnx k1 v1[k2 K3…] #原子性操作,前面失败了就全部失败,批量创建key
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置key
OK
127.0.0.1:6379> keys *
-
“k3”
-
“k2”
-
“k1”
127.0.0.1:6379> mget k1 k2 k3 #批量获取key
-
“v1”
-
“v2”
-
“v3”
127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3 k4 v4 #如果不存在,原子性操作
(integer) 0
#对象
set user:1{name:achang,age:3} #设置一个user:1 对象 值为json保存一个对象
#这里key是一个巧妙的设计:user:{id}:{filed},如此设计在Redis中完全ok
127.0.0.1:6379> mset user:1:name achang user:1:age 13
OK
127.0.0.1:6379> mget user:1:name user:1:age
-
“achang”
-
“13”
getset #先get再set
127.0.0.1:6379> getset room redis #先获取再设置,如果不存在,返回nil,并设置
(nil)
127.0.0.1:6379> get room
“redis”
127.0.0.1:6379> getset room mongoDB #如果存在,返回key的值
“redis”
127.0.0.1:6379> get room
“mongoDB”
127.0.0.1:6379>
String类似的使用场景:value除了字符串还可以是数字
-
计数器
-
统计多单位数量 uid:1001:follow 0 incr
-
粉丝数
-
对象缓存存储
.
基本数据类型,列表
在Redis里面,可以用List玩成:栈,队列,阻塞队列
redis不区分大小写命令
添加:
LPUSH
RPUSH
127.0.0.1:6379> LPUSH list one #将一个值或多个值,插入到链表的头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 #获取list全部的值
-
“three”
-
“two”
-
“one”
127.0.0.1:6379> RPUSH list right
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 #将一个值或多个值,插入到链表的尾部(右)
-
“three”
-
“two”
-
“one”
-
“right”
127.0.0.1:6379>
移除:
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
-
“three”
-
“two”
-
“one”
-
“right”
127.0.0.1:6379> LPOP list #移除list的第一个元素
“three”
127.0.0.1:6379> LRANGE list 0 -1
-
“two”
-
“one”
-
“right”
127.0.0.1:6379> RPOP list #移除list的最后一个元素
“right”
127.0.0.1:6379> LRANGE list 0 -1
-
“two”
-
“one”
移除指定的值:
Lrem key count value #移除指定的值
count>0从前往后移除,=0移除全部,<从后往前
127.0.0.1:6379> LRANGE list 0 -1
-
“three”
-
“three”
-
“two”
-
“ont”
127.0.0.1:6379> LREM list 1 ont #移除list中一个ont
(integer) 1
127.0.0.1:6379> LREM list 2 three #移除list中两个three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1 #查看list全部元素
- “two”
根据下标获取值:
Lindex #通过下标获取某一个值
127.0.0.1:6379> LRANGE list 0 -1
-
“two”
-
“one”
127.0.0.1:6379> LINDEX list 0
“two”
获取list长度:
Llen #获取list长度
127.0.0.1:6379> lpush list ont
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
-
“three”
-
“two”
-
“ont”
127.0.0.1:6379> LLEN list #获取list长度
(integer) 3
裁剪操作:
ltrim #裁剪,会修改原来的list
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> RPUSH mylist hello
(integer) 1
127.0.0.1:6379> RPUSH mylist hello1 hello2 hello3
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
-
“hello”
-
“hello1”
-
“hello2”
-
“hello3”
127.0.0.1:6379> ltrim mylist 1 2
OK
127.0.0.1:6379> LRANGE mylist 0 -1
-
“hello1”
-
“hello2”
组合命令:
rpoplpush #移除列表的最后一个元素,并移动新的列表中
127.0.0.1:6379> rpush mylist hello0 hello1 hello2 hello3 hello4
(integer) 5
127.0.0.1:6379> RPOPLPUSH mylist deslist #移除最后的元素,并最后一个元素添加到deslist中
“hello4”
127.0.0.1:6379> LRANGE mylist 0 -1 #查看mylist列表
-
“hello0”
-
“hello1”
-
“hello2”
-
“hello3”
127.0.0.1:6379> LRANGE deslist 0 -1 #查看目标列表,确实有mylist删除的值
- “hello4”
替换命令:
LSET #前提要求列表存在,设置列表下标的值
127.0.0.1:6379> EXISTS list #判断list是否存在
(integer) 0
127.0.0.1:6379> LSET list 0 hello0 #前提要求列表存在
(error) ERR no such key
127.0.0.1:6379> LPUSH list hello #给list添加值
(integer) 1
127.0.0.1:6379> LSET list 0 hello0 #设置list下标0的值为hello0
OK
127.0.0.1:6379> LRANGE list 0 -1 #查看list所有元素
- “hello0”
插入命令:
linsert 列表 before|after 元素 插入的值 #指定列表前后插入值
127.0.0.1:6379> rpush mylist hello0 hello1 hello2 hello3
(integer) 4
127.0.0.1:6379> LINSERT mylist before hello1 hello0.5 #hello1前插入hello0.5
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 -1 #查看列表
-
“hello0”
-
“hello0.5”
-
“hello1”
-
“hello2”
-
“hello3”
127.0.0.1:6379> LINSERT mylist after hello1 hello1.5 #hello1后插入hello1.5
(integer) 6
127.0.0.1:6379> LRANGE mylist 0 -1 #查看列表
-
“hello0”
-
“hello0.5”
-
“hello1”
-
“hello1.5”
-
“hello2”
-
“hello3”
小结:
-
list实际上是一个链表,(before) Node (after),left,right都可以插入值
-
如果key不存在,创建新的链表
-
如果key存在,新增内容
-
如果移除了key,所有的value就消失了(空链表)
-
在两遍插入后者改动值效率最高,如果是中间元素,效率偏低
消息排队,消息队列
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
1前插入hello0.5
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 -1 #查看列表
-
“hello0”
-
“hello0.5”
-
“hello1”
-
“hello2”
-
“hello3”
127.0.0.1:6379> LINSERT mylist after hello1 hello1.5 #hello1后插入hello1.5
(integer) 6
127.0.0.1:6379> LRANGE mylist 0 -1 #查看列表
-
“hello0”
-
“hello0.5”
-
“hello1”
-
“hello1.5”
-
“hello2”
-
“hello3”
小结:
-
list实际上是一个链表,(before) Node (after),left,right都可以插入值
-
如果key不存在,创建新的链表
-
如果key存在,新增内容
-
如果移除了key,所有的value就消失了(空链表)
-
在两遍插入后者改动值效率最高,如果是中间元素,效率偏低
消息排队,消息队列
[外链图片转存中…(img-4T8BdPoO-1714781118863)]
[外链图片转存中…(img-mPQX6qe0-1714781118863)]
[外链图片转存中…(img-MZ5ckNsl-1714781118864)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新