前言: 不了解Redis是啥的可以去:第一章,redis入门
文章目录
1.java连接Redis
Java连接Redis,请确保你的目标服务器的端口对外开放(云端安全组设置)
1.1 给项目中导入jedis包。
jar包可以复制
[]: https://static.runoob.com/download/jedis-2.9.0.jar
这里是一个maven依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.1</version><!--版本号可根据实际情况填写-->
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
1.2 测试jedis连接
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("134.175.110.184");
// 如果有密码的话,使用这一行
// jedis.auth("password");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: " + jedis.ping());
}
}
1.3 Java操作Redis.
import redis.clients.jedis.Jedis;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class RedisJava {
public static void main(String[] args) {
testSet();
testKeysStar();
testList();
testKeys();
}
private static void testKeys() {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key);
}
}
private static void testList() {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0, 2);
for (int i = 0; i < list.size(); i++) {
System.out.println("列表项为: " + list.get(i));
}
}
private static void testKeysStar() {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
jedis.auth("test123");
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
}
public static void testSet() {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//设置 redis 字符串数据
jedis.set("runoobkey", "www.runoob.com");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: " + jedis.get("runoobkey"));
}
}
1.4 写出Redis常用工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisUtil {
/**
* 服务器IP地址
*/
private static String ADDR = "localhost";
/**
* 端口
*/
private static int PORT = 6379;
/**
* 密码
*/
private static String AUTH = "123456";
/**
* 连接实例的最大连接数
*/
private static int MAX_ACTIVE = 1024;
/**
* 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
*/
private static int MAX_IDLE = 200;
/**
* 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
*/
private static int MAX_WAIT = 10000;
/**
* 连接超时的时间
*/
private static int TIMEOUT = 10000;
/**
* 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
*/
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 数据库模式是16个数据库 0~15
*/
public static final int DEFAULT_DATABASE = 0;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH, DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
System.out.println("redis--服务正在运行: " + resource.ping());
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 释放资源
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
2. Redis 使用场景分析
本章场景主要来自《Redis实战》.
2.1 Redis优化登录和cookie缓存
原有系统:用户登录时可以选择记住账号,并且能将用户的浏览记录保存以供未来用户查看or企业进行分析。
需求:用户登录后,浏览记录频繁的插入数据库,目前已经超过了服务器的承受能力,请问如何优化?
分析:首先,用户每次访问页面,我们可以使用cookieID从redis中查找对应的cookie,进行登录优化。当然优化登录操作并不能带来很明显的性能提升,因为耗时操作往往在之后的插入浏览记录中。
而用户的浏览记录,每次只增加一条,单条操作如果能合并为批量操作就能大大减轻数据库负担。(批量插入更高速。)
浏览记录我们可以先让其在redis缓存,等其攒够一定数量后等待低峰时期使用批量插入,插入到数据库中,尽可能的减少磁盘峰值负载。
所以优化如下:
2.2 使用Redis 优化购物车
上文中使用的cookie,最初的设计意图在于为网商提供一种购物车,让用户可以收集他们想要购买的商品。
现在的购物车往往存放在数据库中,但是用户往往对购物车中的商品进行简单而又耗时的操作:加减商品数量,添加商品。
这样的操作就好像用户在不断的更新,插入数据库数据,而且每次影响的行数只有一行,有时还会频繁操作。这就对磁盘读写能力挑战较大。
同样,我们依然先将用户查询到的购物车内容,或者新增的内容放到Redis中,用户查询时都保存在Redis一份,插入时先插入到Redis之中。然后用户对购物车的操作都是在Redis中进行,暂时与数据库无关。
最终在一段时间后,redis信息过期,将其放入到DB中。
2.3 网页缓存
在动态生成网页的时候,通常会使用模板语言来简化网页的生成操作。但是很多时候很多网页并不会产生太大的变化,此时我们就可以选择将网页缓存到redis中。