redis 存储的是键值对格式的数据。键 key 都是字符串,value 值有五种不同的数据结构。
value 值的数据结构包括:字符串类型(string格式)、哈希类型(map格式)、列表类型(linkedlist格式)、集合类型(set格式)、有序集合类型(sortedset格式)。
哈希类型(map格式)可以在 value 中可以再存储键值对类型的数据。
列表、集合、有序集合可以存储序列数据,集合不允许重复,有序集合中元素有顺序。
命令操作:
存储数据:
set key value
。
获取数据:
get key
。
删除数据:
del key
。
哈希类型:
存储数据:
hset key field value
。
获取数据:
get key field
。
删除数据:
del key field
。
获取所有数据:
hgetall key
。
field 是指 map 集合中的键。
列表类型:实际上是对队列的模拟。
从左边添加:
lpush key value
。
从右边添加:
rpush key value
。
按索引获取部分数据:
lrange key start end
。所有数据可取 0 到 -1。
删除最左边数据并返回:
lpop key
。
删除最右边数据并返回:
rpop key
。
集合类型:不允许重复操作。
存储操作:
sadd key value
。
获取所有数据:
smembers key
。
删除单个数据:
srem key value
。
有序集合类型:元素有顺序,按传入的分数 score(double) 大小进行排序。
存储数据:
zadd key score value
。
获取部分数据同时获取分数:
zrange key start end withscores
。
删除数据:
zren key value
。
编辑 redis 的配置文件中的 save 配置,
save 时间长度 key值改变的数量
。
启动服务器时需要指定配置文件名称,命令行下
redis-server.exe redis.windows.conf
。
会在目录下生成 rdb 文件。
AOF 机制:日志记录方式,可以记录每一条命令的操作,每一次命令操作后持久化数据。
编辑 redis 的配置文件中的 appendonly ,为 no 时表示关闭。为 yes 表示开启。
服务器启动同时要指定配置文件。
配置
appendsync always
为每次操作都持久化、配置
appendsync everysec
为每秒持久化一次、配置
appendsync no
为不持久化。
会在目录下生成 aof 文件。
导入 jar 包。
获取连接,
Jedis jedis = new Jedis(ip地址, 端口号)
。如果是空参构造,默认 "localhost" 和 6379。
操作数据库,方法名与 redis 中的命令操作相同。
关闭连接,
jedis.close()
。
操作 String :
set(key, value)
:存储字符串。
get(key)
:获取字符串。
setex(key, time, value)
:存储指定过期时间的数据,单位为秒。
操作 hash :
hset(key, field, value)
:存储哈希表。
hget(key, value)
:获取哈希中的数据。
hgetAll(key)
:获取哈希中的所有数据,返回的是 map 集合。
操作 list :
lpush(key, value) / rpush(key, value)
:从列表左 / 右存储。可以一次按顺序存储多个值。
lrange(key, start, end)
:获取索引范围内的所有值,返回的是 list 列表。
lpop(key) / rpop(key)
:从列表左 / 右边弹出并返回数据。
操作 set :
sadd(key, value)
:存储集合。可以一次存储多个值。
smembers(key)
:获取集合中的所有数据,返回的是 set 集合。
操作 sortedset :
zadd(key, score, value)
:获取有序列表。
zrange(key, start, end)
:获取索引范围内的所有值,返回的是 set 集合。
Jedis 连接池:
创建 JedisPool 连接池对象:
JedisPool jedisPool = new JedisPool(ip地址, 端口号)
。空参的含义同上。
构造方法也可以传入配置对象。
创建配置对象:
JedisPoolConfig config = new JedisPoolConfig()
。
可以调用配置对象的方法,对配置对象进行设置。
传入配置对象:
JedisPool jedisPool = new JedisPool(config, ip地址, 端口号)
。
获取连接:
Jedis jedis = jedisPool.getResource()
。
数据操作。
归还连接:
jedis.close()
。
Jedis 连接池工具类:
加载配置文件,配置连接池参数,提供获取连接的方法。
public class JedisPoolUtil {
private static JedisPool jedisPool;
static {
InputStream is = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
Properties pro = new Properties();
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
public static Jedis getJedis(){
return jedisPool.getResource();
public class ProvinceDaoImpl implements ProvinceDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Province> findAll() {
String sql = "select * from province";
List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
return list;
Service 包:
public interface ProvinceService {
public List<Province> findAll();
public String findAllAsJSON();
public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao dao = new ProvinceDaoImpl();
@Override
public List<Province> findAll() {
return dao.findAll();
//使用缓存进行优化
@Override
public String findAllAsJSON() {
Jedis jedis = JedisPoolUtil.getJedis();
String provinceAsJSON = jedis.get("province");
if(provinceAsJSON == null || provinceAsJSON.length() == 0) {
//如果没有缓存则查询数据库并存入缓存
List<Province> list = dao.findAll();
ObjectMapper mapper = new ObjectMapper();
try {
provinceAsJSON = mapper.writeValueAsString(list);
} catch (JsonProcessingException e) {
e.printStackTrace();
jedis.set("province", provinceAsJSON);
System.out.println("查询数据库");
} else {
System.out.println("查询缓存");
jedis.close();
return provinceAsJSON;
Servlet 包:
@WebServlet("/findProvinceServlet")
public class FindProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取数据
ProvinceService service = new ProvinceServiceImpl();
List<Province> list = service.findAll();
//2、转换成json格式
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(list);
//使用缓存优化,代替了上方注释掉的代码
String json = service.findAllAsJSON();
//3、响应
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
index.html:
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function () {
$.get("findProvinceServlet", {}, function (data) {
//1、获取select
var province = $("#province")
//2、遍历json
$(data).each(function () {
var option = "<option name='"+this.id+"'>"+this.name+"</option>";
//3、添加option
province.append(option);
</script>
</head>
<select id="province">
<option>---请选择---</option>
</select>
</body>
</html>