Redis介绍
- 默认16个数据库,类似数组下标从0开始,初始默认使用0号库。
- 使用命令select < dbid> 来切换库,如select 1
- 统一密码管理,所有库具有同样的密码
- dbsize查看当前数据库的key的数量
- flushdb清空当前库
- flushall通杀全部库
Redis使用单线程+多路IO复用技术
常用的五大数据类型
Redis的key的操作
- keys :查看当前所有库的key(匹配:keys1)
- exists key :判断某个key是否存在
- type key:查看你的key是什么类型
- del key:删除指定的key数据
- unlink key:根据value选择非阻塞删除(仅将keys从keyspace元数据中删除,真正删除会在后续的异步操作)
- expire key 10:10秒钟:为给定的key设置过期时间
- ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期
- select:用于切换数据库
- dbsize用于查看当前数据库的key的数量
- flushdb:清空当前库(慎用)
- flushall:通杀全部库(慎用)
Redis字符串String
简介
String是Redis中最基本的数据类型,是一个key对应一个value
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化对象
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
数据结构
String的数据结构是简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,采用预编译冗余空间的方式来减少内存的频繁分配。
内存为当前字符串实际分配的空间capacity一般来说要高于实际字符串的长度len。当字符串的长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容一次只会多扩1M的空间。字符串的最大长度是512M。
常用命令
- set命令:
set key value
向数据库中添加key和value,设置相同的key会将之前的value内容覆盖掉 - get命令:
get key
获取数据库中key对应的value值 - append命令:
append key xxx
会在key的value的末尾追加xxx内容 - strlen命令:
strlen key
得到该key对应的value的长度 - setnx命令:
setnx key value
只有当key不存在的时候才会设置成功 - incr命令:
incr key
将key存储的数字值增1,只能对数字值操作,如果数字值为空,新增值为1(原子操作) - decr命令:
decr key
将key中存储的数字值减1 - incrby / decrby命令:
incrby / decrby key 步长
:将key中存储的数字值自增减。自定义步长。
原子操作:指的是不会被线程调度机制打断的操作
这种操作一旦执行就会一直运行到执行结束,中间不会有任何切换到另一个线程的操作
(1) 在单线程中,能够在单条指令完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间
(2)在多线程中,不能被其他进程(线程)打断的操作就叫原子操作 - mset命令:
mset key1 value1 key2 value2....
可以同时设置一个或者多个键值对 - mget命令:
mget key1 key2 key3
可以同时取一个或者多个key的value值 - msetnx命令:
msetnx key1 value1 key2 value2.....
同时设置一个或者多个key-value对,当且仅当所有给定的key都不存在。这是一个原子性操作,如果一个key value设置失败,则所有的都设置失败。 - getrange命令:
getrange key 起始位置 结束位置
获取key对应的值的范围,类似于java的substring。 - setrange命令:
setrange key 起始位置 value
从起始位置开始用value覆写key所存储的字符串值 - setex命令:
setex key 过期时间 value
设置键值的同时,设置过期时间,单位秒 - getset命令:
getset key value
以旧换新,设置新值同时获得旧值,当次返回的是旧值,之后value中存放的是新值
Redis列表List
简介
单键多值
Redis列表是简单的字符串列表,按照插入顺序排序。它的底层是一个双向链表,对两端的操作性能很高,但是通过索引获取中间值的性能比较差。
数据结构
List的数据结构为快速链表quickList
首先在列表元素比较少的情况下会使用一块连续的内存存储,这个内存结构是ziplist(压缩列表)。它将所有的元素紧挨在一起存储,分配的是一块连续的内存。当数据量比较多的情况下才会改为quickList。将多个压缩列表(ziplist)使用quickList连接起来,它是使用双向指针
常用命令
- lpush/rpush命令:
lpush/rpush key1 value1 key2 value2.....
可以从从左边/右边插入一个或多个值。从左边放 v3 v2 v1,从右边放v1 v2 v3 - lpop/rpop命令:
lpop/rpop key
从左边或者右边取出一个值,如果值全部取完则键也销毁。 - rpoplpush命令:
rpoplpush key1 key2
从key1列表的右边吐出一个值,插入到key2列表的左边 - lrange命令:
lrange key start stop
按照索引下标从左到右。0左边第一个元素,-1右边第一个元素,(0 -1表示取所有元素) - lindex命令:
lindex key index
按照索引下标获取元素(从左到右) - llen命令:
llen key
获得列表长度 - linsert命令:
linsert key before/after value newvalue
在value的前面或者后面插入newvalue插入值。 - lrem命令:
lrem key n value
从左边删除n个value(从左到右) - lset命令:
lset key index value
将列表key下标为index的值替换成value
Redis列表Set
简介
Set与List类似是一个列表功能不同的是Set可以自动重排。当需要存储一个列表并且不希望出现重复数据的时候,就可以选取set列表进行存储。Redis中的Set是string类型的无序集合,它的底层是一个value为null的hash表,它的添加删除查找的时间复杂度都是O(1).
数据结构
Set的底层结构是dict字典,字典使用哈希表实现的,所有value都指向同一个内部值。
常用命令
- sadd命令:
sadd key value1 value2.....
将一个或者多个member元素加入到集合中,已经存在的member元素将被忽略 - smembers命令:
smembers key
取出这个key的所有值 - sismember命令:
sismember key value
判断集合key是否有该value值,有为1,没有为0 - scard命令:
scard key
返回该集合的元素个数 - srem命令:
srem key value1 value2....
删除集合中的某个元素 - spop命令:
spop key
随机从该集合中吐出一个值 - srandmember命令:
srandmember key n
随机从该集合中取出n个值。不会从集合中删除。 - smove命令:
smove source destination value
把集合中的一个值从一个集合移动到另一个集合 - sinter命令:
sinter key1 key2
返回两个集合的交集元素 - sunion命令:
sunion key1 key2
返回两个元素并集元素 - sdiff命令:
sdiff key1 key2
返回两个元素交集元素
Redis哈希(Hash)
简介
Redis hash是一个键值对的集合,值是一个string类型的field和value的映射表,比较适合用来存储对象。类似于java中的Map<String,Object>
数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度比较短且个数比较少时,使用ziplist,否则使用hashtable。
常用命令
- hset命令:
hset key field value
给key集合中的field键赋值value - hget命令:
hget key1 field
从key1集合field取出value - hmset命令:
hmset key1 field1 value1 field2 value2....
批量设置hash的值 - hexists命令:
hexists key1 field
查看哈希表key中,给定域field是否存在 - hkeys命令:
hkeys key
列出该hash集合的所有field - hvals命令:
hvals key
列出该hash集合所有value - hincrby命令:
hincrby key field increment
为哈希表key中的域field的值加上增量 1 -1 - hsetnx命令:
hsetnx key field value
将哈希表key中的域field的值设置为value,当且仅当域field不存在
Redis有序集合(Zset)
简介
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。有序集合的每一个成员都关联了一个评分(score),这个评分被用来按照最低分到最高分的方式排序集合中的成员。集合中的成员是唯一的但是评分是可以重复的。
数据结构
zset底层使用了两个数据结构
(1) hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值
(2)跳表,跳表的目的在于给元素value排序,根据score的范围获取元列表
常用命令
- zadd命令:
zadd key score1 value1 score2 value2
将一个或者多个member元素及其score值加入到有序集key当中。 - zrange命令:
zrange key start stop [WITHSCORES]
返回有序集key中,下标在start stop之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集。 - zrangebyscore命令:
zrangebyscore key minmax [withscores][limit offset count]
返回有序集key中,所有score值介于min和max之间(包括等于min和max)的成员。有序集成员按score值递增(从小到大)次序排列 - zrevrangebyscore命令:
zrevrangebyscore key maxmin [withscores][limit offset count]
返回有序集key中,所有score值介于max和min之间(包括等于min和max)的成员。有序集成员按score值递减(从大到小)次序排列 - zincrby命令:
zincrby key increment value
为key中value元素的score加上increment大小的增量 - zrem命令:
zrem key value
删除该集合下指定值的元素 - zcount命令:
zcount key min max
统计该集合,分数区间内的元素个数 - zrank命令:
zrank key value
返回该值在集合中的排名,从0开始