一、数据库操作命令
redis
默认有16
个数据库,类似数组下标从0
开始,初始默认使用0
号库。
1.1 测试是否连通
ping
测试服务器是否连通 返回pone就是连通了
1.2 切换数据库
select index
1.3 数据移动
move key db
1.4 显示数据总量
dbsize
1.5 数据清除
flushdb # 只清除当前库
flushall # 16个库一起清
二、键操作命令
2.1 查看当前库所有key
keys *
2.2 删除指定key
立即删除:
del key
异步删除:
unlink key
2.3 获取key是否存在
exists key
2.4 获取key的类型
type key
2.5 更改key的名字
# 当 key和newkey相同,或者 key不存在时,返回一个错误
# 当 newkey 已经存在时, RENAME 命令将覆盖旧值
rename key newkey
# 当且仅当newkey不存在时,将key改名为newkey,否则不会改名
renamenx key newkey
2.6 指定key的有效期
# 为当前key设置过期10秒的时间
expire key 10
# 为当前key设置过期10毫秒的时间
pexpire key 10
# 以Unix时间戳格式设置键的到期时间(不常用)
expireat key 1393840000
2.7 获取key的有效期
# 以秒为单位返回 key 的剩余过期时间
ttl key
# 以毫秒为单位返回 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中储存的数字值增加指定的值
# 将key中所储存的值加1(默认就是加1,因此不写就是加1)
incr key
# 将key中所储存的值加10
incrby key 10
# 将key中所储存的值加上指定的浮点数增量值
incrbyfloat key 9.9
3.10 将key中储存的数字值减少指定的值
# 将key中储存的数字值减1
decr key
# 将key中所储存的值减少指定值
decrby key 10
3.11 设置有效时间
# 设置键值的同时,设置过期时间(时间单位为秒)
setex key seconds value
# 设置键值的同时,设置过期时间(时间单位为毫秒)
psetex key milliseconds value
3.12 设置指定key的值,并返回key的旧值
GETSET db mongodb # 首次设置没有旧值,返回 nil
GETSET db redis # 返回旧值 mongodb
3.13 获取指定key对应的值的一部分数据
# getrange key 起始位置 结束位置
getrange key 0 3
3.14 覆盖给定key所储存的字符串的一部分值
# setrange key 起始位置 value
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
- 也可以使用json格式保存数据
eg: user:id:3506728370 → {“fans”:12210947,“blogs”:6164,“ focuses ”:83 }
key
的设置约定
表名 | 主键名 | 主键值 | 字段名 | |
---|---|---|---|---|
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 value1 [value2] ……
lpush key 10 20 30
# 从左边插入数据
# 语法:rpush key value1 [value2] ……
rpush key 10 20 30
4.2 获取并移除一个数据(弹出数据)
lpop key # 从左侧弹出
rpop key # 从右侧弹出
每次操作只会弹出一个数据,最终值在键在,值光键亡。
4.3 从key1列表右边吐出一个值,插到key2列表左边
rpoplpush key1 key2
4.4 按照索引下标获得元素(从左到右获取)
lrange key start stop
# 示例
# 0左边第一个,-1右边第一个,这就表示获取所有的意思
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
# 示例 删除5个redis字符串
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
# 在指定时间内 从source列表中取出最后一个元素,并插入到另外一个列表destination的头部
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 添加/修改数据
# key 是redis的键 field是hash中数据的键
hset key field value
# 示例
hset key name "张三"
5.2 获取数据
# 从key中取出 hash的键为field的值
hget key field
# 获取key中全部的hash数据
hgetall key
5.3 删除数据
# 设置了几个field就删除几个
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 的值加上指定值
# 这里的increment只能是整数
hincrby key field increment
# 这里的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 随机获取集中的某个数据并将该数据移除集合
# count不指定时默认为1
spop key [count]
6.8 把集合中一个值从一个集合移动到另一个集合
# source 源集合的名称
# destination 目标集合的名称
# value源集合想要移动的值
smove source destination value
6.9 返回两个集合的交集元素
sinter key1 key2
6.10 返回两个集合的并集元素
sunion key1 key2
6.11 返回两个集合的差集元素
sdiff key1 key2
6.12 求两个集合的交、并、差集并存储到指定集合中
# 求两个集合的交集元素并存储到destination集合当中
sinterstore destination key1 key2
# 求两个集合的并集元素并存储到destination集合当中
sunionstore destination key1 key2
# 求两个集合的差集元素并存储到destination集合当中
sdiffstore destination key1 key2
6.13 set 类型数据操作的注意事项
-
set
类型不允许数据重复,如果添加的数据在set
中已经存在,将只保留一份。 -
set
虽然与hash
的存储结构相同,但是无法启用hash
中存储值的空间。
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之间的元素
# WITHSCORES可加可不加,但是加了可以让分数一起和值返回到结果集
zrange key start stop [WITHSCORES]
# 示例:获取key中下边0-5之间的元素
zrange key 0 5 WITHSCORES
7.3 返回有序集key中,所有 score 值介于min和max之间的元素
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从大到小排列
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
的范围获取元素列表。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116456.html