Redis是一个开源的使用C语言编写的key-value的单线程的存储系统,是跨平台的非关系型数据库。
特征:速度快,多种数据结构,持久化,功能丰富,高可用,多语言支持;
02.Redis基本数据类型内部编码
基础数据结构
字符串String有2种编码
哈希Hash2种编码
列表List2种编码
集合Set2种编码
有序集合Zset2种编码
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。