redis特点
1.速度快
将数据存储在内存中
由C语言编写
线程模型为单线程
2.持久化
Redis将所有数据保持在内存中,并异步更新到磁盘上
3.支持多种数据结构
Hash
List
Set
ZSet
BitMap(位图)
HyperLogLog(超小的内存唯一值计数器)
GEO(地理信息定位)
4.支持多种语言
Python
Ruby
Lua
NodeJS
5.功能丰富
支持类MQ的发布订阅功能
支持Lua脚本
支持事务
6.支持主从复制
7.高可用分布式
启动方式
1 cd redis/bin 2 ./redis-server redis.conf 3 ./redis-cli -h host -p port -a password
./redis-cli -p 6379 -a redis
redis-cli --raw 防中文乱码
通用命令
keys key* 遍历所有的key keys[pattern] 时间复杂度O(n) ,不建议使用
dbsizes 计算key的总数
exists key 检查key是否存在
del key[key ...] 在key存在时删除key
expire key seconds 为给定key设置过期时间,单位为秒
ttl key 查看key的过期时间
persist key 去掉key的过期时间
type key 返回key的类型
string hash list set zset none
内部编码
int的范围相当于Java中的long,为8个字节长整型
字符长度少于等于39个长度时为embstr
字符长度超过39个长度时为raw,比起embstr,是不连续的
hash
hashtable(哈希表) , ziplist(压缩列表)
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
当hash结构的field数量小于等于512并且每个field与value的长度小于等于64时,hash会采用ziplist
list
linkedlist(双向循环链表) , ziplist(压缩列表)
list-max-ziplist-entries 512
list-max-ziplist-value 64
当list结构的元素数量小于等于512并且每个item的长度小于等于64时,list会采用ziplist
set
hashtable(哈希表) , intset(整数集合)
set-max-intset-entries 512
当set结构的元素数量小于等于512时候,set将采用intset
zset
skiplist(跳跃列表) , ziplist(压缩列表)
zset-max-ziplist-entries 512
zset-max-ziplist-value 64
当zset结构的元素数量小于等于512并且每个member的长度小于等于64时,zset会采用ziplist
当key的数量比较少时,Redis采取以时间换空间的策略
当key的数量增多时,Redis采取以空间换时间的策略
查看内部编码的方式 object encoding ${key}
ziplist的特点
连续内存,读写有指针位移,最坏O(n2),新增删除有内存重分配
单线程,高速
1.纯内存
2.epoll 非阻塞io
3.避免线程切换
一次只运行一条命令
拒绝长命令 flushall,flushdb,slow lua script,mutil/exec,operate
String
结构:key-value对 value可以是字符串,数字,二进制数组
String 常用命令
1 get key 获取指定key的值 2 3 set key value 设置指定key的值 4 5 incr key 将key中存储的数字值增一 6 7 incrby key incremen 将key所存储的数字值加上给定的增量 8 9 decr key 将key中存储的数字值减一 10 11 decrby key decrement 将key所存储的数字值减去给定的减量 12 13 setnx key value 只有当key不存在时才设置key的值 14 15 set key value nx 只有当key不存在时才设置key的值 16 17 setex key second value 设置指定key的值,同时设置该key的过期时间,单位为秒 18 19 set key second value ex 设置指定key的值,同时设置该key的过期时间,单位为秒 20 21 set key value xx 只有key存在时才设置key的值 22 23 mget key1 [key2...] 获取所有(一个或多个)指定key的值 24 25 mset key1 value1 [key2 value2...] 同时设置一个或多个key-value对 26 27 其他命令 28 29 getset key newvalue 将给定key的值设置为value,并返回key的旧值 30 31 append key value 将value追加到旧值的末尾 32 33 strlen key 34 35 返回key所存储的字符串值的长度 36 37 当key不存在时,返回0 38 39 一个中文占2个字节 40 41 时间复杂度为O(1),strlen在redis内部不需要查询整个字符串来得到长度 42 43 incrbyfloat key increment 将key所存储的值加上给定的浮点值 44 45 getrange key start end 返回key中字符串区间为[start,end]的子串,索引从0开始 46 47 setrange key offset value 48 49 用value擦书覆盖指定key所存储的字符串值,从偏移量offset开始,索引从0开始 50 51 key = content的时候,执行setrange key 1 haha 之后,key=chahant
Hash
1 hget key field 2 3 获取存储在哈希表中指定field的值 4 5 hset key field value 6 7 将哈希表中指定field的值设置为value 8 9 hdel key field1 [field2...] 10 11 删除哈希表中一个或多个field 12 13 hexists key field 14 15 判断哈希表中,指定field是否存在 16 17 hlen key 18 19 获取哈希表中字段的数量 20 21 hmget key field1 [field2...] 22 23 获取哈希表中所有给定field的值 24 25 hmset key field1 value1 [field2 value2...] 26 27 同时将一个或多个field-value对设置到哈希表中 28 29 hincrby key fiel increment 30 31 为哈希表中指定field的值加上一个整型增量 32 33 hgetall key 34 35 获取哈希表中所有字段和值 36 - 时间复杂度为O(n),不建议使用 37 38 hkeys key 39 40 获取哈希表中的所有字段 41 - 时间复杂度为O(n),不建议使用 42 43 hvals key 44 45 获取哈希表中的所有值 46 - 时间复杂度为O(n),不建议使用 47 48 hsetnx key field value 49 50 只有当哈希表中field不存在时,才设置该field的值 51 52 hincrbyfloat key field increment 53 54 为哈希表中指定field的值加上一个浮点数增量
list
List-结构
列表:有序、可以有重复元素
索引从左往右,从0开始逐个增大 0 1 2 3 4 5
索引从右往左,从-1开始逐个减小 -6 -5 -4 -3 -2 -1
1 rpush key value1 [value2...] 2 3 在列表后侧添加一个或多个值 4 5 lpush key value1 [value2...] 6 7 在列表左侧添加一个或多个值 8 9 linsert key before/after value newValue 10 11 在列表指定的value前/后插入newValue,时间复杂度为O(n) 12 13 lpop key 14 15 从列表左侧弹出一个值 16 17 rpop key 18 19 从列表右侧弹出一个值 20 21 lrem key count value 22 23 - 含义:根据count值,从列表中删除值为value的项,时间复杂度为O(n) 24 - count > 0 时,从左往右遍历,删除最多count个与value相等的值 25 - count < 0 时,从右往左遍历,删除最多Math.abs(count)个与value相等的值 26 - count = 0 时,删除所有与value相等的值 27 时间复杂度是On 28 29 ltrim key start end 30 31 对一个列表进行修剪,只保留指定区间内的元素,不在区间内的元素都将被删除,时间复杂度为O(n) 32 33 lrange key start end 34 35 获取列表指定索引范围的所有元素,时间复杂度为O(n) 36 37 lindex key index 38 39 获取列表指定索引的元素,时间复杂度为O(n) 40 41 llen key 42 43 获取列表长度,时间复杂度为O(1) 44 45 lset key index newValue 46 47 设置列表指定索引的值为newValue,时间复杂度为O(n) 48 - 注意: 49 - 必须存在这个值才能设置成功,否则会报错 50 51 blpop key timeout 52 53 移除并获取列表左边第一个元素,如果列表没有元素会阻塞直到等待超时或可弹出元素为止 54 - timeout单位为秒,timeout=0时不阻塞 55 56 brpop key timeout 57 58 移除并获取列表右边第一个元素,如果列表没有元素会阻塞直到等待超时或可弹出元素为止 59 - timeout单位为秒,timeout=0时不阻塞
set
结构
集合:无序,不可重复
Set-集合内操作
1 sadd key memebr1 [member2...] 2 3 向集合中添加一个或多个成员 4 5 srem key member1 [member2...] 6 7 从集合中删除一个或多个成员 8 9 scard key 10 11 获取集合中的元素个数 12 13 sismember key member 14 15 判断member元素是不是集合的成员 16 17 srandmember key count 18 19 随机从集合中取出count个成员 20 21 spop key 22 23 随机移除并返回集合中的一个成员 24 25 smembers key 26 27 获取集合中的所有成员 28 - 时间复杂度为O(n),不建议使用,类似的操作可以使用SSCAN
Set-集合间操作
1 sdiff key1 [key2...] 2 3 返回给定所有集合的差集 4 5 sdiffstore destKey key1 [key2...] 6 7 计算给定所有集合的差集,并存入destKey 8 9 sinter key1 [key2...] 10 11 返回给定所有集合的交集 12 13 sinterstore destKey key1 [key2...] 14 15 计算给定所有集合的交集,并存入destKey 16 17 sunion key1 [key2...] 18 19 返回给定所有集合的并集 20 21 sunionstore destKey key1 [key2...] 22 23 计算给定所有集合的并集,并存入destKey
集合与有序集合
集合:无重复元素,无序,element
有序集合:无重复元素,有序,element+score
与列表的关系
列表:有重复元素,有序,element
zset
有序集合:有序、不能包含重复元素
每个节点包含:score和value两个属性,根据score进行排序
1 zadd key score1 member1 [score2 member2...] 2 3 向有序集合添加一个或多个成员,或者更新已存在成员的分数 4 5 zrem key member1 [member2...] 6 7 从有序集合中删除一个或多个成员 8 9 zscore key member 10 11 获取有序集合中成员的分数m 12 13 zincrby key increment member 14 15 对有序集合中指定成员的分数加上增量increment 16 17 zcard key 18 19 返回有序集合中元素的总个数 20 21 zrange key start end [withscores] 22 23 通过索引返回有序集合中指定区间的成员信息 24 - withscores 参数,加上代表一并将score数据返回 25 - 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=返回的总个数 26 27 zrangebyscore key min max [withscores][limit] 28 29 通过score返回有序集合中指定分数区间的成员信息 30 - withscores 参数,加上代表一并将score数据返回 31 - limit参数,加上代表限制返回多少条数据 32 - 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=返回的总个数 33 34 zscore key min max 35 36 返回有序集合中指定分数范围内的元素个数 37 - 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定分数范围内的元素个数 38 39 zremrangebyscore key min max 40 41 删除有序集合中指定分数区间的所有成员 42 - 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定分数范围内的元素个数 43 44 zremrangebyrank key start end 45 46 删除有序集合中给定索引区间的所有成员 47 - 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定索引范围内的元素个数
完