缓存的需求
上一遍博文:【SSM分布式架构电商项目-16】实现首页大广告和小广告,我们实现了首页的大广告和小广告。
大广告位数据无需每次查询后台系统的接口,可以在前台系统添加缓存,提高访问首页的速度。
商品类目的数据也可以缓存起来。
实现:
使用Redis实现缓存。
目前缓存的主流技术:
1、 Redis
2、 Memcached
二者谁的性能更高?
1、 单纯从缓存命中的角度来说,是Memcached要高,Redis和Memcache的差距不大
2、 但是,Redis提供的功能更加的强大
二者的区别是什么?
1、 Memcache是多线程
2、 Redis是单线程
Redis
NoSQL
主流的NoSQL产品
Redis简介
Redis官网: http://redis.io/
历史与发展
Redis的特性
Redis版本说明
Redis的安装
安装文件
安装方式一
测试:
安装方式二(安装到系统服务)
先删除原有的系统服务:
安装服务:
32位操作系统安装
只能通过双击打开redis-server.exe启动,不能安装到系统服务。
注意事项
由于文件系统非NTFS,导致Redis启动失败:
Redis-cli使用
redis-cli的使用之发送命令
redis-cli的使用之命令返回值
Redis的多数据库
FLUSHALL – 清空所有数据库的所有数据
FLUSHDB – 清空当前所在数据库的数据
配置数据库数量
Redis的基本命令
KEYS
EXISTS
DEL
TYPE
HELP
HELP 空格 tab键
Redis的字符串数据类型
字符串类型
GET、SET
INCR
INCRBY
DECR、DECRBY
APPEND
STRLEN
MSET、MGET
Redis之生存时间
设置生存时间
TTL返回值:
大于0的数字:剩余生存时间,单位为秒
-1 : 没有生存时间,永久存储
-2 : 数据已经被删除
清除生存时间
设置单位为毫秒
客户端
支持的语言
Jedis
官网:
Jedis的使用
导入itcast-redis:
导入依赖:
简单示例
package cn.itcast.redis;
import redis.clients.jedis.Jedis;
public class JedisDemo {
public static void main(String[] args) {
// 构造jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 向redis中添加数据
jedis.set("mytest", "123");
// 从redis中读取数据
String value = jedis.get("mytest");
System.out.println(value);
// 关闭连接
jedis.close();
}
}
连接池使用
package cn.itcast.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolDemo {
public static void main(String[] args) {
// 构建连接池配置信息
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 设置最大连接数
jedisPoolConfig.setMaxTotal(50);
// 构建连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
// 从连接池中获取连接
Jedis jedis = jedisPool.getResource();
// 读取数据
System.out.println(jedis.get("mytest"));
// 将连接还回到连接池中
jedisPool.returnResource(jedis);
// 释放连接池
jedisPool.close();
}
}
分片式集群
存在的问题:无法动态增加减少服务节点。
分片式集群的使用
package cn.itcast.redis;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
/**
* 集群式的连接池
*
*/
public class ShardedJedisPoolDemo {
public static void main(String[] args) {
// 构建连接池配置信息
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 设置最大连接数
poolConfig.setMaxTotal(50);
// 定义集群信息
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add(new JedisShardInfo("127.0.0.1", 6379));
shards.add(new JedisShardInfo("192.168.29.112", 6379));
// 定义集群连接池
ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards);
ShardedJedis shardedJedis = null;
try {
// 从连接池中获取到jedis分片对象
shardedJedis = shardedJedisPool.getResource();
// for (int i = 0; i < 50; i++) {
// shardedJedis.set("key"+i, "value"+i);
// }
System.out.println(shardedJedis.get("key7"));
System.out.println(shardedJedis.get("key3"));
System.out.println("ok");
// 从redis中获取数据
// String value = shardedJedis.get("mytest");
// System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != shardedJedis) {
// 关闭,检测连接是否有效,有效则放回到连接池中,无效则重置状态
shardedJedis.close();
}
}
// 关闭连接池
shardedJedisPool.close();
}
}