Redis底层原理(1)
你可能不知道自己的潜力有多大,尽情的来吧。 –RuiDer
Before
- Java基础
- Spring
- Mabatis
- Redis
- Belief
Redis概念介绍
1 | Redis:一款NoSql技术,面向Java Web。它就是一个简单的基于内存的数据库, |
Redis优势
- 使用ANSI C语言完成,接近汇编语言,运行速度快
- 基于内存读/写,读写速度相当快。
- 支持6种数据结构,分别是字符串String,链表List,集合Set,散列hash,和基数HyperLogLog,以及有序集合Zset,规则相对较少,处理快。
综上优势,Redis的读写速度更快。。
Redis使用
1 | Redis的使用有两种方式: |
缓存
1 | 持久化数据库的缺点与优点: |
何时使用缓存Redis
1 | 因为缓存基于内存,内存空间有限,价格高贵,所以应该有条件限制 |
Redis缓存简单原理
1 | 使用缓存是因为缓存的读取速度快,而考虑到写操作时,数据库的写操作与其速度差不到那去, |
高速读/写场合
1 | 在互联网行业,对于高并发业务,比如秒杀和抢红包这些业务, |
异步写入数据库
1 | 对于高速读/写场合中单单使用Redis的场景,把这些需要高速读/写的数据, |
Redis的原理解析
此部分需要从两个方面为读者解读,不管是配置也好还是代码堆积也好,他们之间紧紧地联系在一起,读者可以参考阅读。
- Spring环境下的Redis配置细节
- Java环境下的Jedis操作
Spring IOC原理简单回忆
SpringIoc控制反转技术简单的理解就是管理我们日常所用的JavaBean类或者对象,因为一个Bean对象拥有属性和它们各自对应的getter和setter方法等,(只是简单的举JavaBean对象,其他对象也可以),SpringIoc容器干了什么呢?通过我们人为的配置,SpringIOC会在容器中保存对应的Bean对象。下面代码介绍:
1 | package com.ruider; |
###Redis属性以及连接池的属性
Redis:(connectionFactory常用的)
1 | - jedisCOnfig连接池配置信息 |
Redis连接池:(JedisPoolConfig常用)1
2
3- 最大空闲数MaxIdle
- 最大连接数MaxTotal
- 最大等待时间MaxWaitingTimes
Redis使用对象RedisTemplate属性1
2
3- connectionFactory连接工厂(相当于连接池)
- keySerializer Redis键序列化转换类型
- valueSerializer Redis值序列化转换类型
Redis配置式redis-config.xml
根据上述的三种属性介绍进行Redis的属性配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"
default-autowire="byName" default-lazy-init="true">
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<!-- redis服务器中心 -->
<bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" ref="poolConfig" />
<property name="port" value="${redis.port}" />
<property name="hostName" value="${redis.host}" />
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}"></property>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
(1)其中对于JedisPoolConfig连接池的配置1
2
3
4
5<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
至此,JedisPoolConfig的对象已经存储在SpringIOC容器中,在程序应用中可以通过@Autowired
获取JedisPoolConfig的对象。
上面JedisPoolConfig的配置用Java语句实现如下:1
2
3
4
5
6
7
8public class JedisPoolDemo{
public static void main(String[] args){
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(20); //连接池最大空闲数
jedisPoolConfig.setMaxTotal(100); //连接池最大连接数
jedisPoolConfig.setMaxWaitingMillis(2000);//最大等待时间为2秒
}
}
(2)其中ConnectionFactory的配置如下1
2
3
4
5
6
7
8<bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" ref="poolConfig" />
<property name="port" value="${redis.port}" />
<property name="hostName" value="${redis.host}" />
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}"></property>
</bean>
至此ConnectionFactory的对象已经存储在SpringIOC容器中,在程序应用中可以通过@Autowired
获取JedisPoolConfig的对象。
上面ConnectionFactory的配置用Java语句实现如下:1
2
3
4
5
6
7
8
9
10
11
12 //JedisPoolConfig设置
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(20); //连接池最大空闲数
jedisPoolConfig.setMaxTotal(100); //连接池最大连接数
jedisPoolConfig.setMaxWaitingMillis(2000);//最大等待时间为2秒
//ConnectionFactory的设置
ConnectionFactory connectionFactory=new ConnectionFactory(jedisPoolConfig);
connectionFactory.setHost("localhost");
connectionFactory.setPort("6379");
connectionFactory.setTimeOut(2000);
}
(3)其中RedisTemplate的配置如下:1
2
3
4
5
6
7
8
9
10
11<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
至此RedisTemplate的对象已经存储在SpringIOC容器中,在程序应用中可以通过@Autowired
获取RedisTemplate的对象。
上面ConnectionFactory的配置用Java语句实现如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public class RedisTempalteDemo{
public static void main(String[] args){
//JedisPoolConfig设置
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(20); //连接池最大空闲数
jedisPoolConfig.setMaxTotal(100); //连接池最大连接数
jedisPoolConfig.setMaxWaitingMillis(2000);//最大等待时间为2秒
//ConnectionFactory的设置
ConnectionFactory connectionFactory=new ConnectionFactory(jedisPoolConfig);
connectionFactory.setHost("localhost");
connectionFactory.setPort("6379");
connectionFactory.setTimeOut(2000);
//RedisTemplate设置
RedisTemplate redisTemplate=new RedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
//Seriallizer设置
StringSerializer stringSerializer=new StringSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
}
}
补充上面redis-config.xml用到的属性配置
新建redis.properties1
2
3
4
5
6
7
8
9
10
11#redis setting
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000
fep.local.cache.capacity =10000
Redis底层原理
篇幅太长,详情在Redis的底层有介绍,主要介绍一些Redis的命令以及这些命令被Java封装的使用方式。