Redis是一个开源的使用C语言编写的key-value的单线程的存储系统,是跨平台的非关系型数据库。

特征:速度快,多种数据结构,持久化,功能丰富,高可用,多语言支持;

02.Redis基本数据类型内部编码

基础数据结构

字符串String有2种编码

哈希Hash2种编码

列表List2种编码

集合Set2种编码

有序集合Zset2种编码

redis template 原子自增 过期 redis 原子加减_缓存


redis键

keys *:查看当前库所有的key

exists key:判断某个key是否存在

type key:查看你的key是什么类型

del key:删除指定的key数据

unlink key:根据value删除非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在

后续异步中操作。

expire key 10:为指定的key设置有效期10秒

ttl key:查看指定的key还有多少秒过期,-1:表示永不过期,-2:表示已过期

select dbindex:切换数据库【0-15】,默认为0

dbsize:查看当前数据库key的数量

flushdb:清空当前库

flushall:通杀全部库

redis字符串
String是Redis最基本的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
常用命令
set:添加键值对
NX:当数据库中key不存在时,可以将key-value添加到数据库
XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
EX:key的超时秒数
PX:key的超时毫秒数,与EX互斥
value中若包含空格、特殊字符,需用双引号包裹
get:获取值
set name hello
get name
append:追加值
append name world
strlen:获取值的长度
strlen name
setnx:key不存在时,设置key的值
setnx test test #test不存在,返回1,表示设置成功

setnx test test #再次通过setnx设置test,由于已经存在了,所以设 置失败,返回0

incr:原子递增1
#将key中存储的值增1,只能对数字值操作,如果key不存在,则会新建一个,值为1

127.0.0.1:6379> flushdb #清空db,方便测试 
OK
127.0.0.1:6379> set age 30 #age值为30 
OK
127.0.0.1:6379> incr age #age增加1,返回31 (integer) 31 
127.0.0.1:6379> get age #获取age的值 "31" 
127.0.0.1:6379> incr salary #salary不存在,自动创建一个,值为1 (integer) 1 
127.0.0.1:6379> get salary #获取salary的值 "1"

decr:原子递减1

127.0.0.1:6379> flushdb #清空db,方便测试 
OK
127.0.0.1:6379> set age 30 #age值为30 
OK
127.0.0.1:6379> decr age #age递减1,返回29 (integer) 29 
127.0.0.1:6379> get age #获取age的值 "29" 
127.0.0.1:6379> decr salary #salary不存在,自动创建一个,值为-1 (integer) -1 
127.0.0.1:6379> get salary #获取salary "-1"

incrby/decrby: 递增或者递减指定的数字
将key中存储的数字值递增指定的步长,若key不存在,则相当于在原值为0的值上递增指定的步长。

127.0.0.1:6379> set salary 10000 #设置salary为10000 
OK
127.0.0.1:6379> incrby salary 5000 #salary添加5000,返回15000 (integer) 15000 
127.0.0.1:6379> get salary #获取salary "15000"
127.0.0.1:6379> decrby salary 800 #salary减去800,返回14200 (integer) 14200
127.0.0.1:6379> get salary #获取salary "14200

mset:同时设置多个key-value

127.0.0.1:6379> mset name ready age 30 
OK
127.0.0.1:6379> get name "ready" 
127.0.0.1:6379> get age "30"

mget:获取多个key对应的值

127.0.0.1:6379> mset name ready age 30 #同时设置name和age 
OK
127.0.0.1:6379> mget name age #同时读取name和age的值 
1) "ready" 
2) "30"

msetnx:当多个key都不存在时,则设置成功
原子性的,要么都成功,或者都失败。

127.0.0.1:6379> flushdb #清空db,方便测试 
OK
127.0.0.1:6379> set k1 v1 #设置k1 
OK
127.0.0.1:6379> msetnx k1 v1 k2 v2 #当k1和k2都不存在的时候,同时设置k1和k2,由于k1已存 在,所以这个操作失败 
(integer) 0 
127.0.0.1:6379> mget k1 k2 #获取k1、k2,k2不存在 
1) "v1" 
2) (nil) 
127.0.0.1:6379> msetnx k2 v2 k3 v3 #当k2、h3都不存在的时候,同时设置k2和k3,设置成功 
(integer) 1 
127.0.0.1:6379> mget k1 k2 k3 #后去k1、k2、k3的值 
1) "v1" 
2) "v2" 
3) "v3"

getrange:获取值的范围,类似java中的substring

127.0.0.1:6379> set test2 helloworld 
OK
127.0.0.1:6379> getrange test2 0 4 
"hello"

setrange:覆盖指定位置的值

127.0.0.1:6379> set k1 helloworld 
OK
127.0.0.1:6379> get k1 "helloworld" 
127.0.0.1:6379> setrange k1 1 java 
(integer) 10 
127.0.0.1:6379> get k1 "hjavaworld"

setex:设置键值&过期时间(秒)

127.0.0.1:6379> setex k1 100 v1 #设置k1的值为v1,有效期100秒 
OK
127.0.0.1:6379> get k1 #获取k1的值 "v1" 
127.0.0.1:6379> ttl k1 #获取k1还有多少秒失效 (integer) 96

getset:以新换旧,设置新值同时返回旧值

127.0.0.1:6379> set name ready #设置name为ready 
OK
127.0.0.1:6379> getset name tom #设置name为tom,返回name的旧值 "ready" 
127.0.0.1:6379> getset age 30 #设置age为30,age未设置过,返回age的旧值为null 
(nil)

数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构上类似于Java的ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。如图所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次会多扩容1M的空间。要注意的是字符串最大长度为512M。