redis
redis是NOSQL系列的非关系型数据库;NOSQL表示not only sql,就是非关系型数据库。
非关系型数据库:
- 存储的是key和value形式(redis),还有文档形式(MongoDB),等等。数据之间没有关系。
- 数据存储在内存中,提高检索效率(redis做缓存)
redis应用场景:
- 缓存(商品、新闻)
- 任务队列(车票、抢购)
- 排行榜
- 等等
redis的数据结构:
- redis存储的是键值对,其中key都是字符串,value有5中不同的数据结构
- 字符串类型 string
- 哈希类型 hash:
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
安装
下载从redis官方,或者redis中文网;解压后可以直接使用,其中的文件有:
- redis.windows.conf 配置文件
- redis-server.exe 服务器端
- redis-cli.exe 客户端(先打开服务器端,再打开客户端 自动连接)
命令操作
-
字符串
- 存储
set key value
- 获取
get key
- 删除
del key
set username zhangsan get username del username
- 存储
-
哈希类型 (field和value相当于哈希的键值对,可以存储多个)
- 存储
hset key field value
- 获取
hget key field
- 获取所有
hgetall key
- 删除
hdel key field
hset id1 username zhangsan hset id1 age 23 hget id1 username hdel id1 age hdel id1
- 存储
-
列表类型(可以从左边或右边添加)
- 添加
lpush key value
或者rpush key value
- 获取
lrange key start end
,如lrange mylist 0 -1
表示获取所有元素 - 删除
lpop key
或者rpop key
- 添加
-
集合类型
- 存储
sadd key vlaue
- 获取
smembers key
- 删除
srem key value
- 存储
-
有序集合
- 存储
zadd key score value
按照score排序 - 获取
zrange key start end
- 删除
zrem key value
- 存储
通用命令
keys *
查询所有键type key
获取键的类型del key
删除键值对
持久化
redis是一个内存数据库,当redis服务重启,数据会丢失,因此可以将数据保存到硬盘,叫持久化。但是不能保证绝对安全,因为持久化是按时间等设置的。
持久化机制:
- RDB:默认方式,不需要进行配置,默认就使用这种机制(产生一个rdb文件)
- 使用方式:在一定的间隔时间内,检测key的变化情况,然后持久化数据
- 打开redis.windows.conf文件,
- 修改/添加 save 900 1(表示如果1个key发生改变,900秒持久一次)
- 用命令启动redis:
redis-server.exe redis.windows.conf
- 使用方式:在一定的间隔时间内,检测key的变化情况,然后持久化数据
- AOF:日志记录的方式,可以记录每一条命令的操作,可以每次命令操作后,持久化数据,产生一个aof文件。对性能有影响,使用方式:
- 修改配置文件
redis.windows.conf
,将appendonly no
改成appendonly yes
- 修改
appendfsync
appendfsync everysec
默认,每秒持久化一次appendfsync always
每一次操作都进行持久化appendfsync no
不持久化
- 用命令启动redis:
redis-server.exe redis.windows.conf
- 修改配置文件
Java操作
Jedis:一款java操作redis数据库的工具。
使用步骤:
- 导入jedis的jar包
- 获取连接
Jedis jedis = new Jedis("localhost", 6379);
(指定IP和端口) - 操作
jedis.set("username", "zhangsan");
(和命令操作差不多) - 关闭连接
jedis.close();
特殊操作
存储过期时间,存储一段时间自己消失,如手机验证码:
jedis.setex("activecode", 20, "asdf")
(存储20秒,键值对为activecode:asdf)
jedis连接池
jedis自带连接池,作用和jdcb连接池一样。
使用:
- 创建连接池对象
JedisPool jdisPool = new JedisPool("localhost", 6379);
- 调用方法,获取jedis连接
Jedis jedis = jedisPool.getResource();
- 操作
- 关闭连接
jedis.close();
(归还到连接池中) - 关闭连接池
连接池创建时,可以指定配置参数,如下:(具体配置参考配置文件)
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50); // 最大连接
config.setMaxIdle(10); // 最大空闲连接
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
jedis工具类
把配置存在一个配置文件,然后把连接池、创建连接对象等操作放在工具类里面。
步骤:
- 将配置文件
jedis.properties
放在src目录下,修改配置文件。 - 创建JedisPoolUtils工具类,代码如下:
public class JedisPoolUtils {
private static JedisPool jedisPool;
static {
// 读取配置文件
InputStream is = JedisPoolUtils.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 static void close(Jedis jedis) {
jedis.close();
}
}
案例:下拉框中的省份,使用ajax+redis技术
- html代码:
- 下拉框使用ajax技术(js代码):当选择下拉框时,从findProvinceServlet中查找所有省份;
- findProvinceServlet代码:
- 调用ProvinceService查询所有省份
- 将数据序列化json格式
- 响应数据
- ProvinceService代码:
- 先从redis缓存中查找,如果有直接返回,否则调用ProvinceDao从数据库中查找
- ProvinceDao代码:
- 从mysql数据库中查询所有省份