认识NoSQL
SQL | NoSQL | |
---|---|---|
数据结构 | 结构化 | 非结构化 |
数据关联 | 关联的 | 非关联的 |
查询方式 | SQL查询 | 非SQL查询 |
事务特性 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | 1、数据结构固定2、相对业务对数据安全性一致性要求高 | 1、数据结构不固定2、对一致性、安全性要求不高3、对性能要求 |
认识Redis
redis诞生于2009年全称(Remote Dictionary Serve),远程词典服务器,是一个基于内存的NoSQL数据库。
特征:
- 键值类型,valu支持多种不同数据结构,功能丰富。
- 单线程,每个命令具备原子性。
- 低延迟,速度快(基于内存,IO多路复用、良好的编码)。
- 支持数据持久化。
- 支持主从集群、分片集群。
- 支持多语言客户端。
数据结构
通用命令
KEYS
:
KEYS pattern
summary: Find all keys matching the given pattern
DEL
DEL key [key ...]
summary: Delete a key
EXISTS
EXISTS key
[key ...]
summary: Determine if a key exists
EXPIRE
EXPIRE key
seconds
summary: Set a key's time to live in seconds
TTL
TTL key
summary: Get the time to live for a key
注:当查询出来的结果为-2时,则表示该key已经不存在。-1表示永久有效,1表示有时效性。
Key的结构
Redis的key允许有多个单词形成层级结构,多个单词之间用:
隔开,格式如下:
项目名称:业务名:类型:id
格式非固定,可根据自己的需求来删除或添加词条。
数据类型
String类型(最大不能超过512m):
字符串类型,是redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,有可以分为3类:
string:普通字符串
int:整数类型,可以做自增,自减操作
float:浮点类型,可以做自增,自减操作
常见命令
SET
:添加或这修改已经存在的一个String类型的键值对
GET
:根据key获取SDtring类型的value
MSET
:批量添加多个String类型的键值对
MGET
:根据多个key获取多个String类型的value。
INCR
:让一个整型的key自增1。
INCRBY
:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2。
INCRBYFLOAT
:让一个浮点型key自增并设置步长。
SETNX
:添加一个String类型键值对,前提是这个key不存在,否则不执行。
SETEX
:添加一个String类型的键值对,并且执行有效期。
Hash类型:
也称散列,其value是一个无序字典,类似于Java中的HashMap结构。
常见命令
HSET
:添加或者修改hash类型key的field的值
HGET
:获取一个hash类型key的value的值。
HMSET
:批量添加多个hash类型key的field的值。
HMGET
:批量获取多个hash类型key的field的值。
HGETALL
:获取一个hash类型下key的所有field的值。
HKEYS
:获取一个hash类型中所有的field字段。
HVALS
:获取一个hash类型中key的中所有的value值。
HINCRBY
:让一个hash类型key的字段值自增并指定步长。
HSETNX
:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行。
List类型:
redis中list类型与java中的linkedList类似,可以看做是一个双向链表。既可以正向所检索也可以支持反向检索。
特征:
- 有序
- 元素可重复
- 插入和删除快
- 查询速度一般
常见命令
LPUSH
:向列表左侧插入一个或多个元素。
LPOP
:移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH
:向列表右侧插入一个或多个元素。
RPOP
:移除并返回列表右侧第一个元素,没有则返回nil
LRANGE
:返回一段角标内的所有元素。LRANGE key star end
BLPOP和BRPOP
:与RPOP和LPOP类似,没有元素时等待指定时间,而不是返回nil。
注:
返回列表中所有元素LRANGE key 0 -1
提出问题:
如何利用List结构模拟一个栈(先进后出)?
入口和出口都是在一边
如何利用List结构模拟一个队列(先进先出)?
入口和出口不在同一边
如何利用List结构模拟一个阻塞队列?
入口出口不同
出队时采用BLPOP或BRPOP
Set类型:
Redis的Set结构与Java中的HashSet类似,可以看作一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征。
特征
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能。
常见命令
SADD key member
:向set中增加一个或多个元素。
SREM key member
:移除set中指定元素。
SCARD key
:返回set中元素的个数。
SISMEMBER key member
:判断一个元素是否存在于set中。
SMEMBERS
:获取set中所有的元素。
SINTER key1 key2……
:求key之间的交集。
SDIFF key1 key2 ……
:求key之间的差集。
SUNION key1 key2 ……
:求key之间的并集。
案例
sadd zhangsan lisi wangwu zhaoliu
sadd lisi wangwu mazi ergou
SotredSet类型:
可排序的set集合,与Java中TreeSet有些类似,但底层数据结构差别很多大。SortedSet中每一个元素都带有一个scored属性,可以基于scored属性对元素排序,底层的实现是一个跳表加Hash表(我不懂……)。
特性
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
常见命令
ZADD key score member
:添加一个或多个元素到sorted set,如果已经存在则更新其score值。
ZREM key member
:删除SortedSet中的一个指定元素。
ZSCORE key member
:获取sorted set中指定元素的score值。
ZRANK key member
:获取sorted set中指定元素的排名。
ZCARD key
:获取sorted set中元素个数。
ZCOUNT key min max
:统计score值在给定范围内元素的个数。
ZINCRBY key increment member
:让sorted set中的指定元素自增,步长为指定的increment值。
ZRANGE key min max
:按照score排序后,获取指定排名范围内的元素。
ZRANGEBYSCORE key min max
:按照score排序后,获取指定score返回内的元素。
ZDIFF、ZINTER、ZUNION 求差集、交集、并集
注:所有排名默认升序,如果要降序则在命令的Z后添加REV即可。
案例
今天的学习到此结束吧。