一、数据库操作命令
redis
默认有16
个数据库,类似数组下标从0
开始,初始默认使用0
号库。
1.1 测试是否连通
ping
测试服务器是否连通 返回pone就是连通了
1.2 切换数据库
select index
1.3 数据移动
move key db
1.4 显示数据总量
dbsize
1.5 数据清除
flushdb
flushall
二、键操作命令
2.1 查看当前库所有key
keys *
2.2 删除指定key
立即删除:
del key
异步删除:
unlink key
2.3 获取key是否存在
exists key
2.4 获取key的类型
type key
2.5 更改key的名字
rename key newkey
renamenx key newkey
2.6 指定key的有效期
expire key 10
pexpire key 10
expireat key 1393840000
2.7 获取key的有效期
ttl key
pttl key
2.8 把key从会过期的换为不会过期
persist key
2.9 查询模式的使用
语法结构:
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
string
是redis
最基本的类型,一个key
对应一个value
,是一种单键单值的结构。
string
类型是二进制安全的。意味着redis
的string
可以包含任何数据。比如jpg
图片或者序列化的对象。

3.1 添加/修改数据
set key value
3.2 获取数据
get key
3.3 删除数据
del key
3.4 在key不存在时 设置key的值
setnx key value
3.5 添加/修改多个数据
mset key1 value1 key2 value2 …
3.6 获取多个数据
mget key1 key2 …
3.7 获取key对应value的长度
strlen key
3.8 追加信息到原始信息后面
append key value
3.9 将key中储存的数字值增加指定的值
incr key
incrby key 10
incrbyfloat key 9.9
3.10 将key中储存的数字值减少指定的值
decr key
decrby key 10
3.11 设置有效时间
setex key seconds value
psetex key milliseconds value
3.12 设置指定key的值,并返回key的旧值
GETSET db mongodb
GETSET db redis
3.13 获取指定key对应的值的一部分数据
getrange key 0 3
3.14 覆盖给定key所储存的字符串的一部分值
SETRANGE key 6 "Redis"
覆盖的位置从偏移量6开始。
3.13 string命名规约
比如新浪微博大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 }
|
表名 |
主键名 |
主键值 |
字段名 |
eg: |
user |
id |
29437595 |
fans |
这样设置,不仅规则清晰,之后找数据和排错也更加方便,便于维护。
3.14 string类型的其它注意事项
-
数据未获取到时,返回对应的数据为nil
,等同于null
-
数据最大存储量:512MB
-
String
在redis
内部存储默认就是一个字符串,当遇到增减类操作incr
,decr
时会转成数值型进行计算
-
按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis
数值上限范围,将报错
-
redis
所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来
的数据影响.
3.15 string数据结构详解
string
的数据结构为简单动态字符串(Simple Dynamic String
,缩写SDS
)。
是可以修改的字符串,内部实现类似于Java
的ArrayList
,采用预分配冗余空间的方式来减少内存的频繁分配。
它内部为当前字符串实际分配的空间capacity
一般要高于实际字符串长度len
。
当字符串长度小于1M
时,扩容都是加倍现有的空间。
如果超过1M
,扩容时一次只会多扩1M
的空间。需要注意的是字符串最大长度为512M
。
、
四、五大数据类型-list
list
数据类型,一个key
对应多个value
,是一种单键多值的数据结构。
Redis
列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
宏观来看就是key
存储这一个list
的这样结构的数据:

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

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

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

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

所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),那么意味着随着数据增加,查找数据的时间不变。
这在大数据查找时就显得很有优势了。
6.1 添加数据
sadd key member1 [member2]...
asdd myset 9 8 7
6.2 获取全部数据
smembers key
6.3 删除一部分数据
srem key member1 [member2]...
6.4 获取集合数据总量
scard key
6.5 判断集合中是否包含指定数据
sismember key member
6.6 随机获取集合中指定数量的数据
srandmember key [count]
6.7 随机获取集中的某个数据并将该数据移除集合
spop key [count]
6.8 把集合中一个值从一个集合移动到另一个集合
smove source destination value
6.9 返回两个集合的交集元素
sinter key1 key2
6.10 返回两个集合的并集元素
sunion key1 key2
6.11 返回两个集合的差集元素
sdiff key1 key2
6.12 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 key2
sunionstore destination key1 key2
sdiffstore destination key1 key2
6.13 set 类型数据操作的注意事项
6.14 set类型的数据结构
Set
数据结构是dict
字典,字典是用哈希表实现的。
Java
中HashSet
的内部实现使用的是HashMap
,只不过所有的value
都指向同一个对象。
redis
的set
结构也是一样,它的内部也使用hash
结构,所有的value
都指向同一个内部值。
七、五大数据类型-Zset(sorted set)
Redis
有序集合zset
与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score)。
这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。
集合的成员是唯一的,但评分可以重复 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
并且访问有序集合的中间元素也是非常快的。
优势利用zset
实现一个文章访问量的排行榜,就是非常不错的选择。
7.1 将一个或多个元素及其score 值加入到有序集 key 当中
zadd key score1 value1 score2 value2
7.2 返回有序集key中,下标在start到stop之间的元素
zrange key start stop [WITHSCORES]
zrange key 0 5 WITHSCORES
7.3 返回有序集key中,所有 score 值介于min和max之间的元素
zrangebyscore key min max [withscores] [limit offset count]
ZRANGEBYSCORE salary -inf +inf
ZRANGEBYSCORE salary -inf +inf WITHSCORES
ZRANGEBYSCORE salary -inf 5000 WITHSCORES
ZRANGEBYSCORE salary (5000 400000
ZRANGEBYSCORE salary (5000 (400000
包括等于 min 或 max 的元素
返回值按score从小到大排列
zrevrangebyscore key max min [withscores] [limit offset count]
这个和上面的用法几乎一样,只不过返回值按score从大到小排列
7.4 为元素的score加上增量 increment
zincrby key increment value
zincrby myzset 2 "one"
7.4 删除有序集合中指定值的元素
zrem key value
7.5 统计该有序集分数区间内的元素个数
zcount key min max
7.6 返回该值在有序集合中的排名,从0开始
zrank key value>
7.8 zset的数据结构
zset
是redis
提供的一个非常特别的数据结构。
一方面它等价于Java
的数据结构Map<String, Double>
,可以给每一个元素value赋予一个权重score。
另一方面它又类似于TreeSet
,内部的元素会按照权重score
进行排序,可以得到每个元素的名次,还可以通过
score
的范围来获取元素的列表。
zset
底层使用了两个数据结构:
-
hash
:hash
的作用就是关联元素value
和权重score
。
保障元素value
的唯一性,可以通过元素value
找到相应的score
值。
-
跳跃表,跳跃表的目的在于给元素value
排序,根据score
的范围获取元素列表。
zrevrangebyscore key max min [withscores] [limit offset count]
这个和上面的用法几乎一样,只不过返回值按score从大到小排列
7.4 为元素的score加上增量 increment
zincrby key increment value
zincrby myzset 2 "one"
7.4 删除有序集合中指定值的元素
zrem key value
7.5 统计该有序集分数区间内的元素个数
zcount key min max
7.6 返回该值在有序集合中的排名,从0开始
zrank key value>
7.8 zset的数据结构
zset
是redis
提供的一个非常特别的数据结构。
但ZSet
数据较少时底层数据结构是ziplist
,数据较多时转为skiplist
。
一方面它等价于Java
的数据结构Map<String, Double>
,可以给每一个元素value
赋予一个权重score
。
另一方面它又类似于TreeSet
,内部的元素会按照权重score
进行排序,可以得到每个元素的名次,还可以通过
score
的范围来获取元素的列表。
zset
底层使用了两个数据结构:
-
hash
:hash
的作用就是关联元素value
和权重score
。
保障元素value
的唯一性,可以通过元素value
找到相应的score
值。
-
跳跃表,跳跃表的目的在于给元素value
排序,根据score
的范围获取元素列表。