文章目录
- 一、Redis
- 1.非关系型数据库 和 redis
- 2.redis的安装
- 3.redis的数据结构
- 4.操作redis的数据
- 5.持久化
- 二、Jedis
- 1.jedis的jar包
- 2.快速入门
- 3.Jedis操作各种redis中的数据结构
- 4.Jedis连接池
- 5.Jedis连接池工具类
- 三、案例
- 1.准备工作
- 2.代码编写
- 3.运行结果
一、Redis
1.非关系型数据库 和 redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,速度是非常之快的。
2.redis的安装
3.redis的数据结构
1. redis的数据结构:
* redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
* value的数据结构:
1) 字符串类型 string
2) 哈希类型 hash : map格式
3) 列表类型 list : linkedlist格式。支持重复元素
4) 集合类型 set : 不允许重复元素
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
4.操作redis的数据
刚刚学了redis的五种数据结构,接下来就要针对每一种数据结构进行操作
字符串String类型
1. 存储: set key value
2. 获取: get key
3. 删除: del key
哈希类型 hash
哈希类型 hash
1. 存储: hset key field value
127.0.0.1:6379> hset myhash username lisi
127.0.0.1:6379> hset myhash password 123
2. 获取:
* hget key field: 获取指定的field对应的值
127.0.0.1:6379> hget myhash username
"lisi"
* hgetall key:获取所有的field和value
127.0.0.1:6379> hgetall myhash
1) "username"
2) "lisi"
3) "password"
4) "123"
3. 删除: hdel key field
127.0.0.1:6379> hdel myhash username
列表类型 list
列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
1. 添加:
1. lpush key value: 将元素加入列表左表
2. rpush key value:将元素加入列表右边
127.0.0.1:6379> lpush myList a
(integer) 1
127.0.0.1:6379> lpush myList b
(integer) 2
127.0.0.1:6379> rpush myList c
(integer) 3
2. 获取:
* lrange key start end :范围获取
127.0.0.1:6379> lrange myList 0 -1 (这是0到-1,表示获取所有)
1) "b"
2) "a"
3) "c"
3. 删除:
* lpop key: 删除列表最左边的元素,并将元素返回
* rpop key: 删除列表最右边的元素,并将元素返回
集合类型 set
集合类型 set : 不允许重复元素
1. 存储:sadd key value
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
2. 获取:smembers key:获取set集合中所有元素
127.0.0.1:6379> smembers myset
1) "a"
3. 删除:srem key value:删除set集合中的某个元素
127.0.0.1:6379> srem myset a
(integer) 1
有序集合类型 sortedset
有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
1. 存储:zadd key score value
127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
2. 获取:zrange key start end [withscores]
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores (把score也拿出来)
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
5) "lisi"
6) "500"
3. 删除:zrem key value
127.0.0.1:6379> zrem mysort lisi
(integer) 1
通用命令
通用命令
1. keys * : 查询所有的键
2. type key : 获取键对应的value的类型
3. del key:删除指定的key value
5.持久化
P423 09_redis_持久化_RDBP424 10_redis_持久化_AOF
1. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2. redis持久化机制:
1. RDB:默认方式,不需要进行配置,默认就使用这种机制
* 在一定的间隔时间中,检测key的变化情况,然后持久化数据
1. 编辑redis.windwos.conf文件
#(15分钟内至少有一个key发生了改变就持久化一次,持久化就是将内存中的数据写到硬盘上)
save 900 1
# (5分钟内至少有10个key发生了改变就持久化一次)
save 300 10
# (60s内至少有10000个key发生了改变就持久化一次)
save 60 10000
2. 重新启动redis服务器,并指定配置文件名称
D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf
2. AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
1. 编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
redis尽管可以持久化,但是还是不安全的,想要安全就找关系型数据库去
二、Jedis
1.jedis的jar包
Java客户端 Jedis
* Jedis: 一款java操作redis数据库的工具.
* 需要下载jedis的jar包
2.快速入门
3.Jedis操作各种redis中的数据结构
1) 字符串类型 string
set
get
2) 哈希类型 hash : map格式
hset
hget
hgetAll
3) 列表类型 list : linkedlist格式。支持重复元素
lpush / rpush
lpop / rpop
lrange start end : 范围获取
4) 集合类型 set : 不允许重复元素
sadd
smembers:获取所有元素
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
zadd
zrange
4.Jedis连接池
* jedis连接池: JedisPool
* 使用:
1. 创建JedisPool连接池对象
2. 调用方法 getResource()方法获取Jedis连接
5.Jedis连接池工具类
三、案例
案例需求:
1. 提供index.html页面,页面中有一个省份 下拉列表
2. 当 页面加载完成后 发送ajax请求,加载所有省份
* 注意:使用redis缓存一些不经常发生变化的数据。
* 数据库的数据一旦发生改变,则需要更新缓存。
* 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
* 在service对应的增删改方法中,将redis数据删除。
1.准备工作
2.代码编写
ProvinceServiceImpl.class
public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao dao = new ProvinceDaoImpl();
@Override
public List<Province> findAll() {
return dao.findAll();
}
//使用redis缓存
@Override
public String findAllJson() {
//获取redis客户端连接,从redis中查询数据
Jedis jedis = JedisPoolUtils.getJedis();
String province_json = jedis.get("province");
//判断 province_json 数据是否为null
if(province_json == null || province_json.length() == 0){
//redis缓存中没有数据
System.out.println("redis中没数据,查询数据库...");
List<Province> ps = dao.findAll();
//将list序列化为json
ObjectMapper mapper = new ObjectMapper();
try {
province_json = mapper.writeValueAsString(ps);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//将json数据存入redis
jedis.set("province",province_json);
//归还连接
jedis.close();
}else{
System.out.println("redis中有数据,查询缓存...");
}
return province_json;
}
}
3.运行结果
感谢浏览和收藏