String(字符串)
命令基本格式:
set key value [ex seconds] [px milliseconds] [nx|xx]ex seconds:为键设置秒级过期时间px millisecondds:为键设置毫秒级过期时间nx:键必须不能存在,才可以设置成功,用于添加xx:键必须存在,才可以设置成功,用于更新
127.0.0.1:6379> set name test1OK127.0.0.1:6379> get name"test1"127.0.0.1:6379> del name(integer) 1127.0.0.1:6379> get name(nil)
批量插入字符串:
127.0.0.1:6379> mset name1 test1 name2 test2
OK
127.0.0.1:6379> mget name1 name2
1) "test1"
2) "test2"
设置过期时间:
127.0.0.1:6379> set name test2
OK
127.0.0.1:6379> get name
"test2"
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
与上述代码等效
127.0.0.1:6379> setex name 5 test1
OK
如果key不存在就创建
127.0.0.1:6379> setnx name test1
(integer) 1
127.0.0.1:6379> get name
"test1"
127.0.0.1:6379> setnx name test2
(integer) 0
127.0.0.1:6379> get name
"test1"
计数:如果value是数字可以进行增加操作
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> incr age
(integer) 11
127.0.0.1:6379> get age
"11"
127.0.0.1:6379> incr age
(integer) 12
127.0.0.1:6379> get age
"12"
127.0.0.1:6379> incrby age -3
(integer) 9
127.0.0.1:6379> incrby age 3
(integer) 12
不常用命令:
append key value :向字符串尾部追加值
strlen key :字符串长度
getset key value :设置并返回原值
setrange key offset value :设置指定位置的字符
getrange key start end :获取部分字符串
扩容机制:
Redis的字符串内部结构类似Java中的ArrayList,当字符串长度小于1M时,扩容是加倍现有空间,如果超过1M,扩容时只会增加1M空间
值最大不能超过512M
内部编码:
int :8个字节的长整形
embstr :小于等于39个字节的字符串
raw :大于39个字节的字符串
应用场景:
rpush key value [value …]
lpush key value [value …]
linsert key before|after pivot value
lrange key start end:包含start和end
lindex key index
llen key
lpop key
rpop key
lrem key count value:lrem命令会从列表中找到等于value的元素进行删除。count > 0 从做到右,删除最多count个元素。count < 0 从右到左,删除最多count绝对值个元素,count = 0删除所有
ltrim key start end:按照索引范围修剪列表
lset key index newValue
blpop key [key …] timeout
brpop key [key …] timeout
右边进左边出:
127.0.0.1:6379> rpush name test1 test2 test3
(integer) 3
127.0.0.1:6379> llen name
(integer) 3
127.0.0.1:6379> lpop name
"test1"
127.0.0.1:6379> lpop name
"test2"
127.0.0.1:6379> lpop name
"test3"
127.0.0.1:6379> lpop name
(nil)
右边进右边出:
127.0.0.1:6379> rpush name test1 test2 test3
(integer) 3
127.0.0.1:6379> rpop name
"test3"
127.0.0.1:6379> rpop name
"test2"
127.0.0.1:6379> rpop name
"test1"
127.0.0.1:6379> rpop name
(nil)
慢查询:
lindex相当于Java链表的get(int index)方法,需要对链表进行遍历,index可以为负数,index=-1表示倒数第一个元素ltrim在区间内的保留,区间外的全部删除,可以通过ltrim实现定长链表
127.0.0.1:6379> rpush name test1 test2 test3
(integer) 3
127.0.0.1:6379> lindex name
(error) ERR wrong number of arguments for 'lindex' command
127.0.0.1:6379> lindex name 1
"test2"
127.0.0.1:6379> lindex name 0
"test1"
127.0.0.1:6379> lrange name 0 -1
1) "test1"
2) "test2"
3) "test3"
127.0.0.1:6379> ltrim name 1 -1
OK
127.0.0.1:6379> lrange name 0 -1
1) "test2"
2) "test3"
内部编码:
ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries(默认512个)且列表中的每个元素的值都小于list-max-ziplist-value(默认64字节)
linkedlist:当列表类型无法满足ziplist时,使用linkedlist实现
Hash(字典)
基本命令格式
hset key field value
hget key field
hdel key field [field…]
hlen key
hgetall key
hmset key field value [field value]
hmget key field [field…]
hexists key
hkeys key:获取所有的field
hvals key:获取所有的value
hgetall key
hsetnx key field value
hincrby key field increment
hstrlen key field
127.0.0.1:6379> hset name user1 test1
(integer) 1
127.0.0.1:6379> hget name user1
"test1"
127.0.0.1:6379> hset name user2 test2
(integer) 1
127.0.0.1:6379> hset name user3 test3
(integer) 1
127.0.0.1:6379> hgetall name
1) "user1"
2) "test1"
3) "user2"
4) "test2"
5) "user3"
6) "test3"
127.0.0.1:6379> hlen name
(integer) 3
127.0.0.1:6379> hset name user3 test33
(integer) 0
127.0.0.1:6379> hget name user3
"test33"
127.0.0.1:6379> hmset users name1 test1 name2 test2 name3 test3
OK
127.0.0.1:6379> hgetall users
1) "name1"
2) "test1"
3) "name2"
4) "test2"
5) "name3"
6) "test3"
增加操作
127.0.0.1:6379> hmset user age 1
OK
127.0.0.1:6379> hincrby user age 1
(integer) 2
内部编码
Redis的字典相当于Java中的HashMap,Redis采用了渐进式rehash策略
ziplist:当哈希类型的元素个数小于hash-max-ziplist-entries(默认512)时,ziplist更加紧凑,多个元素连续存储
hashtable:当哈希类型无法满足ziplist的条件时,使用hashtable。例如:当value大于64字节时,或者元素个数大于512时
Set(集合)
基本命令格式
sadd key element [element]
srem key element [element]
scard key:计算元素个数
sismember key element:判断元素是否在集合中
srandmember key [count]:随机从集合中返回count(默认1)个元素
spop key:从集合中随机弹出一个元素
smembers key:获取所有元素,属于较重命令,可以使用sscan代替
spop key:从集合随机弹出元素
smembers key:获取所有元素,返回结果是无序的
sinter key [key…]:求集合的交集
sunion key [key…]:求集合的并集
sdiff key [key…]:差集
sinterstore destination key [key…]
suniontstore destination key [key…]
sdiffstore destination key [key…]
127.0.0.1:6379> sadd users test1
(integer) 1
127.0.0.1:6379> sadd users test2
(integer) 1
127.0.0.1:6379> sadd users test3
(integer) 1
127.0.0.1:6379> smembers users
1) "test3"
2) "test1"
3) "test2"
127.0.0.1:6379> sismember users test2
(integer) 1
127.0.0.1:6379> scard users
(integer) 3
127.0.0.1:6379> spop users
"test2"
内部编码
Set集合相当于Java语言里的HashSet,无序且唯一
intset:当集合中的元素都是整数切元素个数小于set-max-intset-entried(默认512个)时,内部编码为intset
hashtable:当元素个数超过512个时或当某个元素不为整数时,内部编码为hashtable
应用场景
Zset(有序集合)
基本命令格式
zadd key score member [score memeber…]
zcard key
zscore key member
zrank key member:计算成员的排名,正序
zrevrank key member
zrem key member [member…]
zincrby key increment member
zrange key start end [withscores]:返回指定排名范围的成员
zrebrange key start end [withscores]
zrangescore key min max [withscores] [limit offset count]:返回指定分数范围的成员,min和max支持开区间(小括号),闭区间(中括号),-inf(无穷小),+inf(无限大)
zrevrangebyscore key max min [withscores] [limit offset count]
zcount key min max:返回指定分数范围成员个数
zremrangebyrank key start end:删除制定排名内的升序元素
zremrangebyscore key min max:删除制定分数范围的成员
zinterstore destination numkeys key [key…] [weights weight [weight]] [aggregate sum|min|max]
127.0.0.1:6379> zadd users 9 age
(integer) 1
127.0.0.1:6379> zadd users 10 age
(integer) 0
127.0.0.1:6379> zadd users 11 age
(integer) 0
127.0.0.1:6379> zrange user 0 -1
(empty list or set)
127.0.0.1:6379> zrange users 0 -1
1) "age"
127.0.0.1:6379> del users
(integer) 1
127.0.0.1:6379> clear
127.0.0.1:6379> zadd users 9 user1
(integer) 1
127.0.0.1:6379> zadd users 10 user2
(integer) 1
127.0.0.1:6379> zadd users 11 user3
(integer) 1
127.0.0.1:6379> zrange users 0 -1
1) "user1"
2) "user2"
3) "user3"
127.0.0.1:6379> zrevrange users 0 -1
1) "user3"
2) "user2"
3) "user1"
127.0.0.1:6379> zcard books
(integer) 0
127.0.0.1:6379> zcard users
(integer) 3
127.0.0.1:6379> zscore users user1
"9"
127.0.0.1:6379> zrangebyscore users 0 9
1) "user1"
127.0.0.1:6379> zrangebyscore users -inf 10 withscores
1) "user1"
2) "9"
3) "user2"
4) "10"
127.0.0.1:6379> zrem users user1
(integer) 1
127.0.0.1:6379> zrange users 0 -1
1) "user2"
2) "user3"
内部编码
ziplist:当有序集合的元素个数小于zset-max-ziplist-entries默认128,同时每个元素的值都小于zset-max-ziplist-value默认64字节时,使用ziplist
skiplist:当ziplist条件不满足时,会转为skiplist
Bitmaps
Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作,其中数组的每个单元都只能是0和1。
例如:判断一个字符串是否在一个大文件中(允许一定误判)。可以先将文件中的字符串都hash后与某一个长度进行取模,映射到数组的下标,然后把这个下标对应的值设置为1。然后对需要判断的字符串hash后与该长度取模,该下标对应的值是1则代表文件中可能包含该字符串,如果是0则代表不包含该字符串
设置bitmap
setbit login:user 1 0
获取bitmap
getbit login:user 1
