redis
一、 数据库
1、数据库
(1)关系型数据库SQL<MySQL、Oracle、DB2、SQLServer>:有表,而且表与表直接存在关系<主外键>;
(2)非关系型数据库No SQL(没有表),可以作为关系型数据库的一个很好的补充,不能替代;
2、NoSQl产生的原因
对数据库高并发访问的需求;
3、NoSQl数据库的分类
(1) 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB。
典型应用:内容缓存,主要用于处理大量数据的高访问负载。
数据模型:一系列键值对
优势:快速查询
劣势:存储的数据缺少结构化
(2)列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
(3)文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型:一系列键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一的查询语法
(4)图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
二、redis
1、redis的介绍
(1)什么是redis?
redis是用c语言开发的开源的高性能的key-value非关系型数据库,主要应用在缓存,目前支持的键值数据类型有五种
(2)redis的应用场景
**缓存
**分布式集群架构中的session分离。
**任务队列。(秒杀、抢购、12306等等)
**应用排行榜。(SortedSet)
**网站访问统计。
**数据过期处理。(expire)
2、redis的五种数据类型
Key全都是字符串的!value有上述5种类型,最重要的是string!!!
redis命令不区分大小写,但是key区分的
redis中的数据都是字符串。
redis是单线程,(不适合存储比较大的数据)
(1)String:key-value【使用最多,和json连用】
**set key value 设置值
**get key 获取值
**如果key对应value是整数
incr key 加一 value+1
decr key 减一 value-1
使用incr 命令,如果key 不存在,会自动创建key 并自动+1.
(2)Hash: key-field-value【一般用于存储JavaBean数据,但是被string+json形式完全替代】
**相当于一个key 对应一个map (map中又是key- value),
**hset key field value 设置值
**hget key field 获取值
**hincrby key field num 设置增数量
(3)List【实时排名】
**List是有顺序可重复(数据结构中的:双链表,队列),可作为链表 ,从左添加元素 也可以从右添加元素。
**lpush list a b c d (从左添加元素)
**rpush list 1 2 3 4 (从右边添加元素)
**lrange list 0 -1 (从0 到 -1 元素查看:也就表示查看所有)
**lpop list (从左边取,删除)
**rpop list (从右边取,删除)
(4)Set【唯一性,使用环境较少】
**Set无顺序,不能重复
**sadd set1 a b c d d (向set1中添加元素) 元素不重复
**smembers set1 (查询元素)
**srem set1 a (删除元素)
(5) SortedSet(zset)【用于网站排名,竞价排名,变化不能太快】
**有顺序,不能重复【适合做排行榜 排序需要一个分数属性】
**zadd zset1 9 a 8 c 10 d 1 e (添加元素 zadd key score member )
**zrange key 0 -1 withscores 查看所有元素,如果要查看分数,加上withscores.
**zrange zset1 0 -1 (从小到大)
**zrevrange zset1 0 -1 (从大到小)
**zincrby zset2 score member (对元素member 增加 score)
3、key命令
**expire key second (设置key的过期时间)
**ttl key (查看剩余时间)(-2 表示不存在,-1 表示已被持久化,正数表示剩余的时间)
**persist key (清除过期时间,也即是持久化 持久化成功体提示 1 不成功0)。
**del key: 删除key
**EXISTS key
若key存在,返回1,否则返回0。
**select 0 表示:选择0号数据库。默认是0号数据库
4、redis持久化方案
Redis 数据都放在内存中。如果机器挂掉,内存的数据就不存在。
需要做持久化,把内存中的数据保存在磁盘,下一次启动的时候就可以恢复数据到内存中。
1、RDB 快照形式 (定期将当前时刻的数据保存磁盘中)会产生一个dump.rdb文件
特点:会存在数据丢失,性能较好,数据备份。
2、AOF append only file (所有对redis的操作命令记录在aof文件中),恢复数据,重新执行一遍即可。
特点:每秒保存,数据比较完整,耗费性能。
3、同时开启两个持久化方案,则按照 AOF的持久化放案恢复数据。默认是按照rdb的方式恢复数据,如果开启了AOF,就是用AOF恢复数据,数据是存在于/usr/local/redis/bin/appendonly.aof文件中
5、redis集群【一台redis的并发量不够时就要用到redis集群】
(1)redis集群架构图
架构细节:
(1)redis间的通信:所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.通过投票机制【一台服务器挂了,他自己可能不知道】
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
0-5000
5001-10000
10001-16383
server1
server2
server3
key1(98 slot)
三、jedis
1、什么是jedis?
集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理
因为集群是比较消耗成本的,所以在公司中,一般生产环境使用集群,开发环境使用单机版。
我们在项目整合中都需要有。可以开发一个接口,有单机版的实现类和集群版的实现类。使用时可以面向接口开发,不影响业务逻辑,使用spring管理实现类,部署时切换实现类即可。
常用的操作redis的方法抽取出一个接口,分别对应单机版和集群版创建两个实现类。