目录
一、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 | 通杀全部库 |