一、认识nosql
1.1结构化与非结构化
MySQL、Oracle、DB2为关系型数据库,结构化数据库
Redis、memcached等为非关系型数据库,非结构化数据库
1.2关联型
MySQL、Oracle、DB2为关联型数据库
Redis、memcached等为非关联型数据库
1.3SQL查询与非SQL查询
MySQL、Oracle、DB2为SQL查询
Redis、memcached等为非SQL查询
1.4 SQL与nosql对比
SQL | nosql | |
---|---|---|
数据结构 | 结构化 | 非结构化 |
数据关联 | 关联的 | 无关联的 |
查询方式 | SQL查询 | 非SQL查询 |
事务特征 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | (1)数据结构固定 (2)相关业务对数据安全性、一致性要求较高 | (1)数据结构不固定(2)对一致性、安全性要求不高(3)对性能要求 |
1.5初识Redis
1.5.1 Redis诞生于2009年全称是Remote Dictionary Server,基于内存操作、键值型、非关系型、非结构化
1.5.2 特征
1.5.2.1 键值型,value支持多种不同数据结构
1.5.2.2 单线程,每个命令具备原子性
1.5.2.3 低延迟,速度快(基于内存,IO多路复用,良好的编码)
1.5.2.4 支持数据持久化
1.5.2.5 支持主从集群,分片集群
1.5.2.6 支持多语言客户端
1.5.3 应用场景
1.5.3.1 缓存[热数据]
1.5.3.2 计数器
1.5.3.3 分工式锁与单线程机制
1.5.3.4 最新列表
1.5.3.5 队列
1.5.3.6 排行榜
1.5.3.7 位操作[大数据处理]
1.5.3.8 session共享
1.5.4 Redis启动
默认启动:Redis -server 会阻塞
指定配置启动:Redis -server Redis.conf
Redis命令行客户端:redis-cli -h 127.0.0.1 -a 123321
二、 Redis数据类型
基本类型 String Hash List Set SortedSet
特殊类型 GEO(坐标类型)BitMap(位图)HyPerLog
三、Redis通用命令
set 增加或修改
get 查询
del 删除
exists 判断key是否存在
TTL 查看一个key的剩余有效期
keys 查看符号模块的所有key
expire 给一个key设置有效期,有效期到期时该key会被自动删除
四、String类型
String:普通字符串
int:整数类型,可以自增,自减操作
float:浮点类型
底层都是字节数组形式存储,最大空间不能超过512M。
常用命令
INCR:让一个整型的key自增1.
SET:添加或者修改已经存在的一个String类型的键值对
MSET:批量添加多个String类型的键值对
GET:根据key获取String类型的value
MGET:根据多个key获取多个String类型的value
INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX:添加一个String类型的键值对,并且指定有效期
五、Hash类型
Hash介绍
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD。
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介绍
Redis中list类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
List类型特征
有序 元素可以重复 插入和删除快 查询速度一般
List应用场景
常用来存储一个有序数据
List常见命令
LPUSH key element...:向列表左侧插入一个或多个元素
LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element ... :向列表右侧插入一个或多个元素
RPOP key:移除并返回列表右侧的第一个元素
LRANGE key star end:返回一段角标范围内的所有元素
l BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
栈、队列
如何利用List结构模拟一个栈?
栈特点:【FILO 先进后出】【入口出口在同一边】
可以使用LPUSH & LPOP | RPUSH & RPOP模拟
如何利用List结构模拟一个队列?
队列特点:【FIFO 先进先出】【入口与出口不在同一边】
可以使用LPUSH & RPOP | RPUSH & LPOP模拟
如何利用List结构模拟一个阻塞队列?
入口和出口在不同边
出队时采用BLPOP或BRPOP
七、Set类型
Set介绍
Redis的set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征。
Set特征
(1)无序
(2)元素不可重复
(3)查找快
(4)支持交集、并集、差集等功能
应用场景
好友列表、共同好友。
常见命令
-
SADD key member...:向set中添加一个或多个元素
-
SREM key member ... : 移除set中的指定元素
-
SCARD key: 返回set中元素的个数
-
SISMEMBER key member:判断一个元素是否存在于set中
-
SMEMBERS:获取set中的所有元素
-
SINTER key1 key2 ... :求key1与key2的交集
-
SDIFF key1 key2 ... :求key1与key2的差集
-
SUNION key1 key2 ..:求key1和key2的并集
八、SortedSet类型
SortedSet介绍
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
特征
-
可排序
-
元素不重复
-
查询速度快
应用场景
SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
常见命令
-
ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
-
ZREM key member:删除sorted set中的一个指定元素
-
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:求差集、交集、并集