redis默认有16个数据库,类似数组下标从0开始,初始默认使用0号库。
ping
测试服务器是否连通 返回pone就是连通了
select index
move key db
dbsize
flushdb # 只清除当前库
flushall # 16个库一起清
keys *
立即删除:
del key
异步删除:
unlink key
exists key
type key
# 当 key和newkey相同,或者 key不存在时,返回一个错误
# 当 newkey 已经存在时, RENAME 命令将覆盖旧值
rename key newkey
# 当且仅当newkey不存在时,将key改名为newkey,否则不会改名
renamenx key newkey
# 为当前key设置过期10秒的时间
expire key 10
# 为当前key设置过期10毫秒的时间
pexpire key 10
# 以Unix时间戳格式设置键的到期时间(不常用)
expireat key 1393840000
# 以秒为单位返回 key 的剩余过期时间
ttl key
# 以毫秒为单位返回 key 的剩余过期时间
pttl key
persist key
语法结构:
keys pattern
使用示例:
keys * 查询所有key
keys java* 查询所有以java开头的key
keys *java 查询所有以java结尾的key
keys ??heima 查询所有前面两个字符任意,后面以java结尾的key
keys user:? 查询所有user:开头,最后一个字符任意的key
keys u[st]er:1 查询所有以u开头,以er:1结尾,中间包含一个字母,s或t的key
string是redis最基本的类型,一个key对应一个value,是一种单键单值的结构。
string类型是二进制安全的。意味着redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

set key value
get key
del key
setnx key value
mset key1 value1 key2 value2 …
mget key1 key2 …
strlen key
append key value
# 将key中所储存的值加1(默认就是加1,因此不写就是加1)
incr key
# 将key中所储存的值加10
incrby key 10
# 将key中所储存的值加上指定的浮点数增量值
incrbyfloat key 9.9
# 将key中储存的数字值减1
decr key
# 将key中所储存的值减少指定值
decrby key 10
# 设置键值的同时,设置过期时间(时间单位为秒)
setex key seconds value
# 设置键值的同时,设置过期时间(时间单位为毫秒)
psetex key milliseconds value
GETSET db mongodb # 首次设置没有旧值,返回 nil
GETSET db redis # 返回旧值 mongodb
# getrange key 起始位置 结束位置
getrange key 0 3
# setrange key 起始位置 value
SETRANGE key 6 "Redis"
覆盖的位置从偏移量6开始。
比如新浪微博大V主页显示粉丝数与微博数量,这种访问量很高的数据,我们应按如下规则命名会比较好:
redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可。eg: user:id:3506728370:fans → 12210947
eg: user:id:3506728370:blogs → 6164
eg: user:id:3506728370:focuses → 83
eg: user:id:3506728370 → {“fans”:12210947,“blogs”:6164,“ focuses ”:83 }
key 的设置约定| 表名 | 主键名 | 主键值 | 字段名 | |
|---|---|---|---|---|
| eg: | user | id | 29437595 | fans |
这样设置,不仅规则清晰,之后找数据和排错也更加方便,便于维护。
数据未获取到时,返回对应的数据为nil,等同于null
数据最大存储量:512MB
String在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来
的数据影响.
string的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。
是可以修改的字符串,内部实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
它内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。
当字符串长度小于1M时,扩容都是加倍现有的空间。
如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
、
list数据类型,一个key对应多个value,是一种单键多值的数据结构。
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
宏观来看就是key存储这一个list的这样结构的数据:

# 从左边插入数据
# 语法:lpush key value1 [value2] ……
lpush key 10 20 30
# 从左边插入数据
# 语法:rpush key value1 [value2] ……
rpush key 10 20 30
lpop key # 从左侧弹出
rpop key # 从右侧弹出
每次操作只会弹出一个数据,最终值在键在,值光键亡。
rpoplpush key1 key2
lrange key start stop
# 示例
# 0左边第一个,-1右边第一个,这就表示获取所有的意思
lrange mylist 0 -1
range操作不会移除元素,和pop操作是不同的
lindex key index
llen key
linsert key before value newvalue
lrem key count value
# 示例 删除5个redis字符串
lrem mylist 5 redis
count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count 。count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。count = 0 : 移除表中所有与value相等的值。lset key index value
# 在指定时间内 从左边移出并获取列表的第一个元素
blpop key1 [key2] timeout
# 在指定时间内 从右边移出并获取列表的第一个元素
brpop key1 [key2] timeout
# 在指定时间内 从source列表中取出最后一个元素,并插入到另外一个列表destination的头部
brpoplpush source destination timeout
list的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。
比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。

这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
hash数据类型是一个键值对集合,可以理解为左边一个key,对右边一个存储空间。
右边这块儿存储空间叫hash,也就是说hash是指的一个数据类型。
它指的不是一个数据,是这里边的一堆数据,那么它底层呢,是用hash表的结构来实现的。
值得注意的是:
如果右边存储空间数量较少,存储结构优化为类数组结构。
如果右边存储空间数量较多,存储结构使用HashMap结构。

宏观来看就是一个string类型的field(字段)和value(值)的映射表,特别适合用于存储对象。
类似Java里面的Map。
比如用户id为查找的key,存储的value为用户对象的各个字段的键值对:如果用普通的key/value结构来存储

这样通过 **key(用户ID) + field(属性标签) **就可以操作对应属性数据了。
既不需要重复存储数据,也不会带来反复序列化和并发修改控制的问题。
# key 是redis的键 field是hash中数据的键
hset key field value
# 示例
hset key name "张三"
# 从key中取出 hash的键为field的值
hget key field
# 获取key中全部的hash数据
hgetall key
# 设置了几个field就删除几个
hdel key field1 field2...
hsetnx key field value
hmset key field1 value1 field2 value2 …
hmget key field1 field2 …
hlen key
hexists key field
hkeys key
hvals key
# 这里的increment只能是整数
hincrby key field increment
# 这里的increment只能是浮点数
hincrbyfloat key field increment
hsetnx key field value
hash类型中value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。
如果数据未获取到,对应的值为(nil)。
每个hash可以存储 2^32-1个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。
但hash设计初衷不是为了存储大量对象而设计 的,切记不可滥用,更不可以将hash作为对象列表使用。
hgetall操作可以获取全部属性,如果field过多,遍历整体数据效率会很低,有可能成为数据访问瓶颈。
hash类型的数据结构主要有两种:ziplist(压缩列表),hashtable(哈希表)。
当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
redis 的set数据类型对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。
当需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。
并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
set是一个string类型的无序集合。它底层其实是一个value为null的hash表。

所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),那么意味着随着数据增加,查找数据的时间不变。
这在大数据查找时就显得很有优势了。
sadd key member1 [member2]...
# 示例:
asdd myset 9 8 7
smembers key
srem key member1 [member2]...
scard key
sismember key member
srandmember key [count]
# count不指定时默认为1
spop key [count]
# source 源集合的名称
# destination 目标集合的名称
# value源集合想要移动的值
smove source destination value
sinter key1 key2
sunion key1 key2
sdiff key1 key2
# 求两个集合的交集元素并存储到destination集合当中
sinterstore destination key1 key2
# 求两个集合的并集元素并存储到destination集合当中
sunionstore destination key1 key2
# 求两个集合的差集元素并存储到destination集合当中
sdiffstore destination key1 key2
set 类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间。
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。
redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score)。
这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。
集合的成员是唯一的,但评分可以重复 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
并且访问有序集合的中间元素也是非常快的。
优势利用zset实现一个文章访问量的排行榜,就是非常不错的选择。
# 就是每个值前面得加一个分数用来排序
zadd key score1 value1 score2 value2
# WITHSCORES可加可不加,但是加了可以让分数一起和值返回到结果集
zrange key start stop [WITHSCORES]
# 示例:获取key中下边0-5之间的元素
zrange key 0 5 WITHSCORES
zrangebyscore key min max [withscores] [limit offset count]
# 示例
ZRANGEBYSCORE salary -inf +inf # 显示整个有序集salary的数据
ZRANGEBYSCORE salary -inf +inf WITHSCORES # 显示整个有序集及成员的 score 值
ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 显示工资 <=5000 的所有成员
ZRANGEBYSCORE salary (5000 400000 # 显示工资大于 5000 小于等于 400000 的成员
ZRANGEBYSCORE salary (5000 (400000 # 显示工资大于 5000 小于 400000 的成员
包括等于 min 或 max 的元素
返回值按score从小到大排列
zrevrangebyscore key max min [withscores] [limit offset count]
这个和上面的用法几乎一样,只不过返回值按score从大到小排列
zincrby key increment value
# 示例
zincrby myzset 2 "one" # 返回值是增加后的分数
zrem key value
zcount key min max
zrank key value>
zset是redis提供的一个非常特别的数据结构。
一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score。
另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过
score的范围来获取元素的列表。
zset底层使用了两个数据结构:
hash:hash的作用就是关联元素value和权重score。
保障元素value的唯一性,可以通过元素value找到相应的score值。
跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
zrevrangebyscore key max min [withscores] [limit offset count]
这个和上面的用法几乎一样,只不过返回值按score从大到小排列
zincrby key increment value
# 示例
zincrby myzset 2 "one" # 返回值是增加后的分数
zrem key value
zcount key min max
zrank key value>
zset是redis提供的一个非常特别的数据结构。
但ZSet数据较少时底层数据结构是ziplist,数据较多时转为skiplist。
一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score。
另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过
score的范围来获取元素的列表。
zset底层使用了两个数据结构:
hash:hash的作用就是关联元素value和权重score。
保障元素value的唯一性,可以通过元素value找到相应的score值。
跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。