文章目录

  • 一、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和redis statck区别 redis和jedis区别_数据


redis和redis statck区别 redis和jedis区别_redis_02

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,速度是非常之快的。

2.redis的安装

P417 03_redis_下载&安装

redis和redis statck区别 redis和jedis区别_数据_03

3.redis的数据结构

1. redis的数据结构:
		* redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
			* value的数据结构:
				1) 字符串类型 string
				2) 哈希类型 hash : map格式  
				3) 列表类型 list : linkedlist格式。支持重复元素
				4) 集合类型 set  : 不允许重复元素
				5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序

redis和redis statck区别 redis和jedis区别_持久化_04

4.操作redis的数据

刚刚学了redis的五种数据结构,接下来就要针对每一种数据结构进行操作

字符串String类型

1. 存储: set key value
		2. 获取: get key
		3. 删除: del key

redis和redis statck区别 redis和jedis区别_redis_05


哈希类型 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

redis和redis statck区别 redis和jedis区别_持久化_06


列表类型 list

redis和redis statck区别 redis和jedis区别_redis_07

列表类型 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: 删除列表最右边的元素,并将元素返回

redis和redis statck区别 redis和jedis区别_数据_08


集合类型 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

redis和redis statck区别 redis和jedis区别_数据_09


有序集合类型 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

redis和redis statck区别 redis和jedis区别_redis_10


通用命令

通用命令
		1. keys * : 查询所有的键
		2. type key : 获取键对应的value的类型
		3. del key:删除指定的key value

redis和redis statck区别 redis和jedis区别_持久化_11

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包

redis和redis statck区别 redis和jedis区别_redis_12

2.快速入门

redis和redis statck区别 redis和jedis区别_redis_13


redis和redis statck区别 redis和jedis区别_持久化_14


redis和redis statck区别 redis和jedis区别_redis_15


redis和redis statck区别 redis和jedis区别_持久化_16

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

redis和redis statck区别 redis和jedis区别_持久化_17


redis和redis statck区别 redis和jedis区别_redis_18


redis和redis statck区别 redis和jedis区别_数据_19


redis和redis statck区别 redis和jedis区别_数据_20


redis和redis statck区别 redis和jedis区别_redis_21

4.Jedis连接池

* jedis连接池: JedisPool
		* 使用:
			1. 创建JedisPool连接池对象
			2. 调用方法 getResource()方法获取Jedis连接

redis和redis statck区别 redis和jedis区别_数据_22


redis和redis statck区别 redis和jedis区别_数据_23

5.Jedis连接池工具类

redis和redis statck区别 redis和jedis区别_数据_24


redis和redis statck区别 redis和jedis区别_持久化_25


redis和redis statck区别 redis和jedis区别_redis_26

三、案例

案例需求:
	1. 提供index.html页面,页面中有一个省份 下拉列表
	2. 当 页面加载完成后 发送ajax请求,加载所有省份
* 注意:使用redis缓存一些不经常发生变化的数据。
	* 数据库的数据一旦发生改变,则需要更新缓存。
		* 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
		* 在service对应的增删改方法中,将redis数据删除。

redis和redis statck区别 redis和jedis区别_持久化_27

1.准备工作

redis和redis statck区别 redis和jedis区别_持久化_28


redis和redis statck区别 redis和jedis区别_数据_29


redis和redis statck区别 redis和jedis区别_数据_30

2.代码编写

redis和redis statck区别 redis和jedis区别_redis_31


redis和redis statck区别 redis和jedis区别_数据_32


redis和redis statck区别 redis和jedis区别_redis_33


redis和redis statck区别 redis和jedis区别_持久化_34

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;
    }
}

redis和redis statck区别 redis和jedis区别_数据_35

3.运行结果

redis和redis statck区别 redis和jedis区别_数据_36


redis和redis statck区别 redis和jedis区别_数据_37

感谢浏览和收藏