Redis诞生于2009,全程是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL(not only sql)数据库.
Redis特征
1.键值型,value支持多种不同的数据结构,功能丰富
2.单线程,每个命令具备原子性
3.低延迟(因为是基于内存存储的,读写操作效率高)
4.支持数据持久化
5.支持主从集群,分片集群
6。支持多语言客户端(c,java,python...)
Redis通用命令
keys:查看复合模版的所有key(*为通配符,”_为占位符“,例如查找包含name的key:keys *name*),不建议在生产环境设备上使用,因为模糊匹配带来的查询压力以及redis单线程的特性,会造成堵塞。
del:删除一个指定的key (例如 del key1 key2)
exists:判断key是否存在 (exists key1)
expire:为key设置一个有效期(单位为秒),例如 expire name 20。对于没有给设置有效期的key返回值则为-1(即为永久)。
ttl:查看一个key的剩余有效期。
String类型
String类型,字符串类型,是redis中最简单的存储类型
其value是字符串,根据字符串格式的不同,可以分为三类:
string:普通字符串
int:整数类型,可以做自增,自减操作
float:浮点类型,可以做自增,自减操作
string常见命令:
set:添加或修改一个已经存在的string类型的键值对,如set key1 value1
get:根据set的key来获取value,如get key1
mset:批量添加,如set key1 value1 key2 value2
mget:批量获取,如get key1 ke2
incr:自增1,incr key1,则value++;
incrby:自增并指定步长,incrby key2 5,则value+=5
setex:添加一个string类型的键值对,并且指定有效期,例如setex key1 10 value1,则有效十秒
setnx:添加一个string类型的键值对,前提是这个key不存在,否则不执行,例如setnx key1 value1
Redis的key的格式:
为防止id冲突,redis的key允许有多个单词形成层级结构,多个单词之间用‘:’隔开,格式如下:
[项目名]:[业务名];[类型]:[id]
并非固定,可以根据实际的业务需求来删除或添加词条。
例如我们的项目名称叫 heima,有 user 和 product 两种不同类型的数据,我们可以这样定义 key:
◆ user 相关的 key: heima:user:1
◆ product 相关的 key: heima:product:1
即set heima:user:1 '{"id":1, "name": "Jack", "age": 21}'
其会在可视化软件中自动设置层级。
Hash 类型
Hash 类型,也叫散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 结构。
String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便:
| KEY | VALUE |
|---|---|
| heima:user:1 | {name:"Jack", age:21} |
| heima:user:2 | {name:"Rose", age:18} |
Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD:
| KEY | field | value |
|---|---|---|
| heima:user:1 | name | Jack |
| age | 21 | |
| heima:user:2 | name | Rose |
| age | 18 |
Hash 类型的常见命令
Hash 的常见命令有:
- HSET key field value:添加或者修改 hash 类型 key 的 field 的值
- HGET key field:获取一个 hash 类型 key 的 field 的值
- HMSET:批量添加多个 hash 类型 key 的 field 的值
- HMGET:批量获取多个 hash 类型 key 的 field 的值
- HGETALL:获取一个 hash 类型的 key 中的所有的 field 和 value
- HKEYS:获取一个 hash 类型的 key 中的所有的 field
- HVALS:获取一个 hash 类型的 key 中的所有的 value
- HINCRBY:让一个 hash 类型 key 的字段值自增并指定步长
- HSETNX:添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行
List类型的常见命令
List 类型
List类似java中的的双向链表,可对两边进行push和pop操作
List 的常见命令
- LPUSHkey element [...]:向列表左侧插入一个或多个元素
- LPOPkey:移除并返回列表左侧的第一个元素,没有则返回 nil
- RPUSHkey element [...]:向列表右侧插入一个或多个元素
- RPOPkey:移除并返回列表右侧的第一个元素
- LRANGEkey start end:返回一段角标范围内的所有元素
- BLPOP和BRPOP:与 LPOP 和 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 null
思考
1.如何利用list结构模拟一个栈?
入口和出口在同一边,即对一边进行操作即可。
2.如何利用list结构模拟一个队列?
入口出口不在同一边,即对两边分别进行push和pop操作。
3.如何利用list结构模拟一个阻塞队列?
入口出口在不同边,并在出队时采用BLPOP或者BRPOP。
Set类型
Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做是一个 value 为 null 的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
Set 类型的常见命令
- SADDkey member ...:向 set 中添加一个或多个元素
- SREMkey member ...:移除 set 中的指定元素
- SCARDkey:返回 set 中元素的个数
- SISMEMBERkey member:判断一个元素是否存在于 set 中
- SMEMBERS:获取 set 中的所有元素
- SINTERkey1 key2 ...:求 key1 与 key2 的交集
- SDIFFkey1 key2 ...:求 key1 与 key2 的差集
- SUNIONkey1 key2 ...:求 key1 和 key2 的并集
SortedSet 类型
Redis 的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。SortedSet 具备下列特性:
- 可排序
- 元素不重复
- 查询速度快因为 SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet 类型的常见命令
SortedSet 的常见命令有:
- ZADDkey score member:添加一个或多个元素到 sorted set,如果已经存在则更新其 score 值
- ZREMkey member:删除 sorted set 中的一个指定元素
- ZSCOREkey member:获取 sorted set 中的指定元素的 score 值
- ZRANKkey member:获取 sorted set 中的指定元素的排名
- ZCARDkey:获取 sorted set 中的元素个数
- ZCOUNTkey min max:统计 score 值在给定范围内的所有元素的个数
- ZINCRBYkey increment member:让 sorted set 中的指定元素自增,步长为指定的 increment 值
- ZRANGEkey min max:按照 score 排序后,获取指定排名范围内的元素
- ZRANGEBYSCOREkey min max:按照 score 排序后,获取指定 score 范围内的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
SpringDataRedis快速入门
其可以在get过程中将对象反序列化,其会在写入json的同时写入该对象的class的字节码名称。
但与此同时,会带来额外的内存空间。
因此为了节省内存空间,并不会使用json序列化器来处理value,而是统一使用string序列化器,要求只能存储string类型的key和value,当需要存储java对象时,手动完成对象的序列化和反序列化,如下图所示:
至此,关于redis的基础部分就先搞一段落,谢谢大家。