# redis使用案例 **Repository Path**: wangkaij/redis-use-case ## Basic Information - **Project Name**: redis使用案例 - **Description**: - 提供一个index.html页面,页面中有一个省份,下拉列表 - 当页面加载完成后,发送ajax请求,加载所有省份 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-15 - **Last Updated**: 2021-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Redis **概念:** redis是一款高性能的NOSQL系列的非关系型数据库 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0915/175129_fcb2ac13_6533787.jpeg "数据库对比.jpg") # 什么是NOSQL? 泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 ## Redis 简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: - Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 - Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 - Redis支持数据的备份,即master-slave模式的数据备份。 ## Redis 优势 - 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 - 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 - 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 - 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 # 下载安装 中文网:[Redis中文网](https://www.redis.net.cn/) 解压直接可以使用: - redis.windows.conf:配置文件 - redis-cli.exe:redis的客户端 - redis-server.exe:redis服务器端 # 命令操作 **redis的数据结构:** - redis存储的是:key, value格式的数据,其中key都是字符串,value有5种不同的数据结构 - value的数据结构: 1. 字符串类型 string 2. 哈希类型 hash (map格式) 3. 列表类型 list (linkedlist格式) 4. 集合类型 set (hashset格式) 5. 有序集合类型 sortedset - ![输入图片说明](https://images.gitee.com/uploads/images/2021/0915/175208_baf60d00_6533787.jpeg "redis数据格式.jpg") - **字符串类型 string** - 存储:set key value - 获取:get key - 删除:del key - **哈希类型 hash** - 存储:hset key field value - key:哈希数据名 - field:每一条数据的名 - 获取:hget key field - hget key field:获取指定的field对应的值 - hgetall key:获取所有的field和value - 删除:hdel key field - **列表类型 list:** 可以添加一个元素到列表的头部(左边)或者尾部(右边) - 添加: - lpush key value:将元素加入列表左边 - rpush key value:将元素加入列表右边 - 获取: - lrange key start end:范围获取 - 删除: - lpop key:删除列表最左边的元素,并将元素返回 - rpop key:删除列表最右边的元素,并将元素返回 - **集合类型 set:** 不允许重复元素 - 存储:sadd key value - 获取:smembers key:获取set集合中所有元素 - 删除:srem key value:删除set集合中某个元素 - **有序集合类型 sortedset:** 不允许重复元素,且有序 - 存储:zadd key score value: - 获取:zrange key start end - 删除:zren key value - **通用命令** - keys * :查询所有键 - type key:获取键对应的value的类型 - del key:删除指定的key value # 持久化 redis是内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可一将redis内存中的数据持久化保存到硬盘的文件中 **redis持久化机制:** - RDB:默认方式,不需要进行配置,默认就是用这种机制 - 在一定的间隔时间中,检测key的变化情况,然后持久化数据 - 编辑redis.windows.conf文件 - save 900 1:表示如果900秒内至少1个key发生变化(新增、修改和删除),则重写rdb文件 - save 300 10:表示如果每300秒内至少10个key发生变化(新增、修改和删除),则重写rdb文件 - save 60 10000:表示如果每60秒内至少10000个key发生变化(新增、修改和删除),则重写rdb文件 - 重新启动redis服务器,并指定配置文件名称 - F:\Program Files\Redis-x64-5.0.10>redis-server.exe redis.windows.conf - AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据 - 编辑redis.windows.conf文件 - appendonly no (关闭AOF) --> appendonly yes (开启AOF) - appendfsync always:每一次操作都进行持久化 - appendfsync everysec:每隔一秒进行一次持久化 - appendfsync no:不进行持久化 # Java客户端 Jedis **Jedis:** 一款java操作redis数据库的工具 **使用步骤:** - 下载jedis的jar包 - 使用 ```java public void test1(){ //1. 获取连接 Jedis jedis = new Jedis("127.0.0.1",6379); //2. 操作 jedis.set("username","zhangsan"); //3. 关闭连接 jedis.close(); } ``` **Jedis操作各种redis中的数据结构:** 1. 字符串类型 string - set() - get() - setex():可以指定存储的时间 - `jedis.setex("key", 20, "hehe");`将key : hehe键值对存入redis,并且20秒后自动删除 2. 哈希类型 hash - hset() - hget() - hgetAll():获取hash的所有map中的数据 3. 列表类型 list - lpush() / rpush() - `jedis.lpush("mylist", "a","b","c")`从左边存 - `jedis.rpush("mylist", "a","b","c")`从右边存 - lpop() / rpop() - lrange() 4. 集合类型 set - sadd() - smembers():获取所有元素 5. 有序集合类型 sortedset - zadd() # 连接池:JedisPool **使用:** - 创建JedisPool连接池对象 - 调用方法getResource()方法获取Jedis连接 ```java public void test7(){ //0. 创建一个配置对象 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(50); config.setMaxIdle(10); //1. 创建Jedis连接池对象 JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379); //2. 获取连接 Jedis jedis = jedisPool.getResource(); //3. 使用 jedis.set("hehe","haha"); System.out.println(jedis.get("hehe"));; //4. 关闭 归还到连接池中 jedis.close(); } ``` ## Jedis连接池工具类 **配置文件:** jedis.properties ```properties host=127.0.0.1 port=6379 maxTotal=50 maxIdle=10 ``` **连接池工具类:** JedisPoolUtils.java ```java /** * JedisPool工具类 * 加载配置文件,配置连接池参数 * 提供获取连接的方法 */ public class JedisPoolUtils { private static JedisPool jedisPool; static { //读取配置文件 InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"); //创建Properties对象 Properties properties = new Properties(); //关联文件 try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } //获取数据,设置到JedisPoolConfig中 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal"))); config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle"))); //初始化JedisPool jedisPool = new JedisPool(config,properties.getProperty("host"), Integer.parseInt(properties.getProperty("port"))); } /** * 获取连接的方法 */ public static Jedis getJedis(){ return jedisPool.getResource(); } } ``` **测试类:** JedisTest.java ```java /** * jedis测试类 */ public class JedisTest { @Test public void test8(){ Jedis jedis = JedisPoolUtils.getJedis(); jedis.set("username","zhangsan"); System.out.println(jedis.get("username")); jedis.close(); } } ``` # 案例: **案例需求:** - 提供一个index.html页面,页面中有一个省份,下拉列表 - 当页面加载完成后,发送ajax请求,加载所有省份 - [redis使用案例](https://gitee.com/wangkaij/redis-use-case) ![输入图片说明](https://images.gitee.com/uploads/images/2021/0915/175235_16fb9ada_6533787.jpeg "省份加载案例分析.jpg") **注意:** 使用redis缓存一些不经常发生变化的数据 - 数据库的数据一旦发生改变,则需要更新缓存