redis

来源:互联网 发布:php 调用setcookie 编辑:程序博客网 时间:2024/06/06 00:48

一、总体介绍

1. 什么是redis

redis是一个nosql(not only sql不仅仅只有sql)数据库.翻译成中文叫做非关系型型数据库.
关系型数据库:以二维表形式存储数据
非关系型数据库: 以键值对形式存储数据(key, value形式)
是一家意大利的创业公司出的,然后后来这家公司被VMware赞助. redis底层用C语句编写.

redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中,
redis有点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒最有,具体限制于硬件.
缺点:对持久化支持不够良好,
所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用.


2. redis应用领域
分布式缓存
分布式session
保存博客或者论坛的留言回复等.
总之是用在数据量大,并发量高的情况下


3. 怎么用
redis主要就是使用命令来进行操作,java端在代码中可以使用Jedis来操作redis服务器
redis数据类型
字符串String
列表list  redis中使用的是双向循环链表来实现的list,在redis中更像栈
散列Hash  一般应用于将redis作为分布式缓存,存储数据库中的数据对象
集合set set中数据是无序的并且不允许重复
有序集合zset redis会根据分数自动排序,这里可以使用在学生成绩排序,
或者是手机应用商店流行软件排名等需求中
4.redis持久化方案:
rdb:可以设置间隔多长时间保存一次(Redis不用任何配置默认的持久化方案)
有点:让redis的数据存取速度变快
缺点:服务器断电时会丢失部分数据(数据的完整性得不到保证)
aof:可以设置实时保存
优点:持久化良好,能包装数据的完整性
缺点:大大降低了redis系统的存取速度
5. 主从复制:
这里使用了心跳检测机制,主从复制必须使用rdb持久化方式
从服务器一般是只读的,保证主服务器和从服务器的数据一致性


二、redis 安装

将redis-3.0.0.tar.gz拷贝到/usr/local

解压源码

   tar -zxvf redis-3.0.0.tar.gz  

进入解压后的目录进行编译

cd /usr/local/redis-3.0.0

make

安装到指定目录,/usr/local/redis

cd /usr/local/redis-3.0.0 

make PREFIX=/usr/local/redis install

 

n redis.conf

redis.confredis的配置文件,redis.confredis源码目录。

注意修改port作为redis进程的端口,port默认6379

拷贝配置文件到安装目录下

进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下

cd /usr/local/redis

mkdir conf

cp /usr/local/redis-3.0.0/redis.conf  /usr/local/redis/bin

安装目录bin下的文件列表


redis启动

修改redis.conf配置文件,daemonize yes以后端模式启动。 

执行如下命令启动redis

cd /usr/local/redis

./bin/redis-server ./redis.conf

redis默认使用6379端口。

redis停止

强行终止Redis进程可能会导致redis持久化数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:

cd /usr/local/redis

./bin/redis-cli shutdown

redis客户端测试是否成功

redis-cli 是redis自带的客户端 

bin/redis-cli连接redis服务端

./redis -cli -h ip地址 -p 端口

jedis第三方jar包连接redis

commons-pool  jedis 包或pom<artifactId>jedis</artifactId>
Spring整合jedis

<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>

<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="192.168.93.88"/>
<constructor-arg name="port" value="6379"/>

</bean>

java测试代码

private ApplicationContext applicationContext;

@Before
public void setUp() throws Exception{
String configLocation = "classpath:ApplicationContext.xml";
applicationContext = new ClassPathXmlApplicationContext(configLocation);
}

@Test
public void testJedisSpring() throws Exception{
//获取连接池
JedisPool jedisPool = (JedisPool)applicationContext.getBean("jedisPool");
//获取连接
Jedis jedis = jedisPool.getResource();
//存入
jedis.set("key4", "bbb");
//取出
System.out.println(jedis.get("key4"));

}
}

RDB持久化

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

RDBRedis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1

save 300 10

save 60 10000

save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照,“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。

redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费2030秒钟。

问题总结:

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

 

AOF持久化

默认情况下Redis没有开启AOFappend only file)方式的持久化,可以通过appendonly参数开启:

appendonly yes

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬

盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof


主从复制

简单说就是

redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。防止redis服务器的硬盘损坏了可能会导致数据丢失

复制过程说明:

 

1、 slave 服务启动,slave会建立和master的连接,发送sync命令。

2master启动一个后台进程将数据库快照保存到RDB文件中

注意:此时如果生成RDB文件过程中存在写数据操作会导致RDB文件和当前主redis数据不一致,所以此时master主进程会开始收集写命令并缓存起来。

3master就发送RDB文件给slave

4slave 将文件保存到磁盘上,然后加载到内存恢复

5master把缓存的命令转发给slave

注意:后续master收到的写命令都会通过开始建立的连接发送给slave

master slave 的连接断开时slave可以自动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有slave

 

完整复制的问题:

 

redis2.8之前从redis每次同步都会从主redis中复制全部的数据,如果从redis是新创建的从主redis中复制全部的数据这是没有问题的,但是,如果当从redis停止运行,再启动时可能只有少部分数据和主redis不同步,此时启动redis仍然会从主redis复制全部数据,这样的性能肯定没有只复制那一小部分不同步的数据高。







原创粉丝点击