目录
一、Redis的概述与安装
1.1 NoSQL数据库简介
NoSQL:即 Not Only SQL,意为“不仅仅是SQL”,泛指非关系型数据库,作为关系型数据库的补充。
NoSQL 不依赖业务逻辑方式存储,而以简单的 key-value 模式存储。
-
不遵循 SQL 标准
-
不支持 ACID
-
远超 SQL 的性能
NoSQL 适用场景
-
对数据高并发的读写
-
海量数据的读写
-
对数据高扩展性的处理
NoSQL 不适用场景
-
需要事务支持
-
基与 sql 的结构化查询存储,处理复杂的关系
1.2 Redis 概述
概念:Redis 是一个开源的高性能键值对(key-value)数据库。
特征:
①:数据间没有必然的关联关系
②:内部采用单线程机制进行工作
③:高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000 次/s,写的速度是81000次/s。
④:多数据类型支持:
-
字符串类型 string
-
列表类型 list
-
散列类型 hash
-
集合类型 set
-
有序集合类型 sorted_set
⑤:持久化支持
1.3 Redis 安装
1.4 Redis 常用指令
quit exit //退出 clear //清屏 help 命令名称 help @组名 //获取帮助,可以使用Tab键来切换
help 命令:
二、数据类型
2.1 redis 数据存储格式
-
redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
-
数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
2.2 string 类型
2.1.1 string 类型存储格式
-
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
-
存储数据的格式:一个存储空间保存一个数据
-
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
2.2.2 string 类型的基本操作命令
命令 | 作用 |
---|---|
set key value | 添加/修改数据 |
get key | 获取数据 |
del key | 删除数据 |
mset key1 value1 key2 value2 ...... | 添加/修改多个数据 |
mget key1 key2 ...... | 获取多个数据 |
strlen key | 获取数据字符个数(字符串长度) |
append key value | 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) |
2.2.3 string 类型数据的扩展操作命令
命令 | |
---|---|
incr key | 将 key 储存的数字增加 1,只能对数字值操作,如果为空,新增值为1 |
incrby key increment | 将 key 中存储的数字值增加指定的大小。只能是整数。 |
incrbyfloat key increment | 将 key 中存储的数字值增加指定的大小。可以是小数。 |
decr key | 将 key 储存的数字减 1,只能对数字值操作,如果为空,新增值为 -1 |
decrby key increment | 将 key 中存储的数字值减少指定的大小。 |
setex key seconds value | 设置键值的同时,设置过期时间,单位为秒。 |
psetex key milliseconds value | 设置键值的同时,设置过期时间,单位为毫秒。 |
2.2.4 string 类型数据操作的注意事项
string 作为数值操作
-
string 在 redis 内部存储默认就是一个字符串,当遇到增减类操作 incr,decr 时会转成数值型进行计算。
-
redis 所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
-
注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。
string 数据操作不成功的反馈与数据正常操作之间的差异
①:表示运行结果是否成功
-
(integer)0 ---> false 失败
-
(integer)1 --->true 成功
②:表示运行结果值
-
(integer)3 ---> 3 3个
-
(integer)1 --->1 1个
③:数据未获取到
-
(nil)等同于 null
④:数据最大存储量
-
512MB
⑤:数值计算最大范围(Java中long的最大值)9223372036854775807
2.3 hash 类型
2.3.1 hash类型存储格式
-
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
-
需要的存储结构:一个存储空间保存多个键值对数据
-
hash类型:底层使用哈希表结构实现数据存储
-
hash 存储结构优化
-
如果 Field 数量较少,存储结构优化为类数组结构
-
如果 Field 数量较多,存储结构使用 HashMap 结构
-
2.2.2 hash 类型数据基本操作命令
命令 | 作用 |
---|---|
hset key field value | 给 key 集合中的 field 键赋值 value |
hget key field | 从 key 集合 field 取出 value |
hgetall key | 从 key 集合中取出 field |
hdel key field1 [field2] | 删除数据 |
hmset key field1 value1 field2 value2 ...... | 批量添加数据 |
hmset key field1 field2 ...... | 获取多个数据 |
hlen key | 获取哈希表中字段的数量 |
hexists key field | 查看哈希表 key 中,给定域 field 是否存在。存在返回1,不存在返回0 |
2.2.3 hash 类型数据扩展操作
命令 | 作用 |
---|---|
hkeys key | 获取哈希表中所有的字段名 |
hvals key | 获取哈希表中所有的字段值 |
hincrby key field increment | 设置指定字段的数值数据增加指定范围的值。只能是整数。 |
hincrbyfloat key field increment | 设置指定字段的数值数据增加指定范围的值。可以是小数 |
2.2.4 hash 类型数据操作的注意事项
-
hash 类型下的 value 只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
-
每个 hash 可以存储 2^31 - 1 个键值
-
hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但是 hash 设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可将 hash 作为对象列表使用
-
hgetall 操作可以获得全部属性,如果内部 field 过多,遍历整体数据效率就会低,有可能会成为数据访问瓶颈。
2.4 list 类型
2.4.1 list类型存储格式
-
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
-
需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
-
保存多个数据,底层使用双向链表存储结构实现
-
元素有序,且可重复
2.4.2 list 类型数据基本操作命令
命令 | 作用 |
---|---|
lpush key value1 value2 value3 ...... | 添加数据,从左边添加 |
rpush key value1 value2 value3 ...... | 添加数据,从右边添加 |
lrange key start end | 按照索引范围获取元素(从左到右)。(0 -1)表示获取所有 |
llen key | 得到长度 |
lindex key index | 按照指定索引获取元素 |
lpop key | 从list左边移除数据 |
rpop key | 从list右边移除数据 |
2.4.3 list 类型数据扩展操作命令
命令 | 作用 |
---|---|
blpop key1 key2 ...... timeout | 如果在指定时间内放入了元素,就移除,b=block。 |
brpop key1 key2 ...... timeout | 如果在指定时间内放入了元素,就移除,b=block |
lren key count value | 移除指定元素 coun:移除的个数 value:移除的值。移除多个相同元素时,从左边开始移除 |
2.4.4 list 类型数据操作的注意事项
-
list 中保存的数据都是 string 类型的,数据容量是有限的,最多 2^32-1个元素
-
list 具有索引的概念,但是操作数据时通常以队列的形式进行入队出队(rpush,rpop)操作,或以栈的形式进行入栈出栈(lpush,lpop)操作
-
获取全部数据操作结束索引设置为 -1(倒数第一个元素)
-
list 可以对数据进行分页操作,通常第一页的信息来自于 list ,第2页及更多的信息通过数据库的形式加载
2.5 set 类型
2.5.1 set 类型存储格式
-
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
-
不重复且无序
2.5.2 set 数据类型基本操作命令
命令 | 作用 |
---|---|
sadd key member1 member2 ...... | 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略 |
smembers key | 查看该集合的所有值 |
srem key member | 删除集合中的某个元素 |
scard key | 返回该集合的元素个数 |
sismember key member | 判断集合<key> 是否为含有该<value> 值,有1,没有0 |
2.5.3 set 数据类型扩展操作命令
命令 | 作用 |
---|---|
srandmember key count | 从集合中取出 count 个元素 |
spop key count | 从集合中选出 count 个元素并移除 |
sinter key1 key2 ...... | 求两个集合的交集 |
sunion key1 key2 ...... | 求两个集合的并集 |
sdiff key1 key2 ...... | 求两个集合的差集 |
sinterstore destination key1 key2 ...... | 求两个集合的交集,并放入另一个set中 |
sunionstore destination key1 key2 ...... | 求两个集合的并集,并放入另一个set中 |
sdiffstore destination key1 key2 ...... | 求两个集合的差集,并放入另一个set中 |
smove source destination key | 求指定元素从原集合放入目标集合中 |
2.6 sorted_set 类型
2.6.1 sorted_set 数据类型存储格式
-
不重但有序
-
新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
-
需要的存储结构:新的存储模型,可以保存可排序的数据
-
sorted_set类型:在set的存储结构基础上添加可排序字段
2.6.2 sorted_set 数据类型基本操作命令
命令 | 作用 |
---|---|
zadd key score1 member1 score2 member2 ...... | 插入元素,需要指定 score(用于排序) |
zrange key start end (withscore) | 查看元素(升序),末尾加上wiithscore时,会将元素的score一起打印出来 |
zrevrange key start end(withscore) | 查看元素(降序),末尾加上wiithscore时,会将元素的score一起打印出来 |
zrem key member1 member2 ...... | 移除元素 |
zremrangebyank key start end | 按条件移除元素 |
zremrangebyscore key min max | 按条件移除元素 |
zpopmax key [count] | 按照从大到小的顺序移除 count 个值 |
zpopmin key [count] | 按照从小到大的顺序移除 count 个值 |
zcard key | 获得元素的个数 |
zcount min max | 获得元素在范围内的个数 |
zinterstore dextination numkeys key1 key2 | 求交集并放入destination中, 其中numkey1为要去交集集合的数目 |
zunionstore dextination numkeys key1 key2 | 求并集并放入destination中, 其中numkey1为要去并集集合的数目 |
注意:
-
min 与 max 用于限定搜索查询的条件
-
start 与 stop 用于限定查询范围,作用与索引,表示开始和结束索引
-
offset 与 count 用于限定查询范围,作用于查询结果,表示开始位置和数据总量
2.6.3 sorted_set 数据类型扩展操作命令
作用 | 命令 |
---|---|
zrank key member | 查看某个元素的索引(排名)正序 |
zrevrank key member | 查看某个元素的索引(排名)倒序 |
zscore key member | 查看某个元素索引的值 |
zincrby key increment member | 增加某个元素索引的值 |
2.6.4 sorted_set 数据类型操作的注意事项
-
score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
-
score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
-
sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
三、Redis键(key)
关于 key 的一些命令
命令 | 作用 |
---|---|
keys * | 查看当前库的所有 key |
exists key | 判断某个key是否存在 |
type key | 查看的你key是什么类型 |
del key | 删除指定的key |
unlink key | 根据value选择非阻塞删除,仅将key从keyspace元数据中删除,真正的删除会在后序异步操作 |
expire key 10 | 10秒钟:为给定的key设置过期时间 |
ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已经过期 |
selec id | 命令切换数据库 |
dbsize | 查看当前数据库的key的数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |