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的方法抽取出一个接口,分别对应单机版和集群版创建两个实现类。

   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值