1、redis基本特性
Redis是基于内存的Key-Value型高性能的NoSQL数据库。
1.1、基于键值对的数据结构
redis主要提供了5种数据结构(即5种不同类型的值value):
字符串类型(String)、散列类型(Hash)、列表类型(List)、集合类型(Set)、有序集合类型(SortedSet,简称Zset)
1.2、速度快
1.Redis的所有数据都是存放在内存中的,所以把数据放在内存中是Redis速度快的最主要原因。
2. Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度 相对会快。
3. Redis使用了单线程架构,预防了多线程可能产生的竞争问题。
1.3、比较丰富的功能
1.提供了键过期功能,可以用来实现缓存 提供了发布订阅功能,可以用来实现消息系统 。
2.提供了简单的事务功能,能在一定程度上保证事务特性。
3.提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。
1.4、客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便的接入到Redis,所以支持Redis的客户端语言也非常多,基本涵盖了主流的编程语言。
- 官网中列出了一些Java的客户端,比如Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推荐使用Jedis和Redisson。
1.5、持久化
由于redis的数据是放在内存中的,一旦发生断点或者机器故障,会丢失重要的数据,因此为了保证数据的持久性,提供了两种持久化到硬盘的方案:
- RDB方式(默认)
- AOF方式
1.6、主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。
1.7、高可用和分布式
Redis从2.8版本提供了高可用实现:Redis Sentinel (哨兵模式),它能够保证Redis节点的故障发现和故障自动转移。
Redis从3.0版本提供了分布式实现Redis Cluster 集群,保证了高可用、高性能、高可扩展性。
2、应用场景
2.1、内存数据库
可以用于实现登录信息、购物车信息、用户浏览记录等功能。
2.2、缓存服务器
可以用于实现商品数据、广告数据等功能。
2.3、解决分布式集群架构中的session分离问题(session共享)
2.4、消息队列
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然功能比较少,但是对于一般的消息队列功能基本可以满足。
可以用于实现秒杀、抢购等功能。
2.5、应用排行榜
排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理的使用这些数据结构可以很方便的构建各种排行榜系统。
2.6、网站访问统计
3、Java客户端Jedis
3.1、添加jar包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
3.2、单实例连接
@Test
public void testJedis() {
//创建一个Jedis的连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
//执行redis命令
jedis.set("key", "hello world");
//从redis中取值
String result = jedis.get("key");
//打印结果
System.out.println(result);
//关闭连接
jedis.close();
}
3.3、连接池连接
@Test
public void testJedisPool() {
//创建一连接池对象
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//从连接池中获得连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("key") ;
System.out.println(result);
//关闭连接
jedis.close();
//关闭连接池
jedisPool.close();
}
3.4、spring整合JedisPool
- 配置spring配置文件applicationContext.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 连接池配置 -->
<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="false" />
<!-- 在空闲时检查有效性, 默认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="主机ip" />
<constructor-arg name="port" value="端口号" />
</bean>
</beans>
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("key1", "xiaoli");
String name = jedis.get("key1");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}