JAVA【21】Redis
文章目录
- 今日内容redis
- 一、概念:
- 1、什么是NOSQL
- 2、主流的NOSQL产品
- 3、什么是Redis
- 二、下载安装使用
- 三、命令操作
- 1. redis的数据结构:
- 2. 类型1:字符串类型 string
- 3. 类型2:哈希类型 hash
- 4. 类型3:列表类型 list:
- 5. 类型4:集合类型 set : 不允许重复元素
- 6. 类型5:有序集合类型 sortedset:
- 7. 通用命令
- 四、持久化
- 1、RDB:
- 2、AOF:
- 3、Redis 持久化方式
- 五、Redis事务
- 1、什么是事务?特性?
- 2、Redis 事务命令
- 3、入门实例
- 4、常见使用?
- 六、Java客户端 Jedis
- 1、Jedis: 一款java操作redis数据库的工具.
- (1)下载jedis的jar包
- (2)使用
- 2、Jedis操作各种redis中的数据结构
- (1)字符串类型 string
- (2)哈希类型 hash : map格式
- (3)列表类型 list : linkedlist格式。支持重复元素
- (4)集合类型 set : 不允许重复元素
- (5)有序集合类型 zset(sortedset):不允许重复元素,且元素有顺序
- (6)Redis Java Keys 实例
- 3、jedis连接池: JedisPool
- (1)使用:
- (2)导入依赖
- (3)测试类
- (4)连接池工具类
- (5)配置文件jedis.properties
- 六、案例:
- 1、案例需求:
- 2、注意:使用redis缓存一些不经常发生变化的数据。
今日内容redis
- 1. 概念
- 2. 下载安装
- 3. 命令操作(数据结构)
- 4. 持久化操作
- 5. 使用Java客户端操作redis
- 6. Radis中文官网
一、概念:
redis是一款高性能的NOSQL系列的非关系型数据库
1、什么是NOSQL
NoSQL
(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
1.1.1. NOSQL和关系型数据库比较
优点:
(1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
(2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
(3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
(4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
(1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
(2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
(3)不提供关系型数据库对事务的处理。
1.1.2. 非关系型数据库的优势:
(1)性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
(2)可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
1.1.3. 关系型数据库的优势:
(1)复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
(2)事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
1.1.4. 总结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
2、主流的NOSQL产品
1、键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
2、列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
3、文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
4、图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
3、什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
- 字符串 string
- 哈希 hash
- 列表 list
- 集合 set
- 有序集合 zset(sortedset)
redis的应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离
二、下载安装使用
1、官网:https://redis.io
2、中文网:http://www.redis.net.cn/
3、解压直接可以使用:
* redis.windows.conf:配置文件
* redis-cli.exe:redis的客户端
* redis-server.exe:redis服务器端
简单入门
三、命令操作
1. redis的数据结构:
redis存储的是:
key:value格式的数据,其中key都是字符串,
value有5种不同的数据结构value的数据结构
:
(1)字符串类型string: string
(2)哈希类型hash : map格式
(3)列表类型list : linkedlist格式
支持重复元素
(4)集合类型set : 不允许重复元素
(5)有序集合类型zset:sortedset不允许重复元素,且元素有顺序
2. 类型1:字符串类型 string
String常用命令
存储: set key value
获取: get key
删除: del key
127.0.0.1:6379> set username zhangsan -- 存储username:zhangsan
OK
127.0.0.1:6379> get username -- 获取存储的值
"zhangsan"
127.0.0.1:6379> del username -- 删除存储的值
(integer) 1
127.0.0.1:6379> get username -- 删除后获取
(nil)
127.0.0.1:6379> set username 22 -- 存储字符串22
OK
127.0.0.1:6379> set username 33 -- 存储覆盖
OK
127.0.0.1:6379> get username -- 获取覆盖后的
"33"
127.0.0.1:6379>
3. 类型2:哈希类型 hash
(1)存储: hset key field value
127.0.0.1:6379> hset myhash username lisi
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 1
(2)获取: hget key field
-- hget key field: 获取指定的field对应的值
127.0.0.1:6379> hget myhash username
"lisi"
-- hgetall key:获取所有的field和value
127.0.0.1:6379> hgetall myhash1) "username"2) "lisi"3) "password"4) "123"
127.0.0.1:6379>
(3)删除: hdel key field
127.0.0.1:6379> hdel myhash username -- 删除username键值
(integer) 1
127.0.0.1:6379> hgetall myhash -- 查询所有键值1) "password"2) "123"
127.0.0.1:6379>
4. 类型3:列表类型 list:
可以添加一个元素到列表的头部(左边)或者尾部(右边)
(1)添加:
- lpush key value: 将元素加入列表左表
- 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 -11) "b"2) "a"3) "c"
(3)删除:
- lpop key: 删除列表最左边的元素,并将元素返回
- rpop key: 删除列表最右边的元素,并将元素返回
-- 存储数据
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
-- 遍历数据
127.0.0.1:6379> lrange mylist 0 -11) "b"2) "a"3) "c"
-- 演示弹出数据
127.0.0.1:6379> lpop mylist
"b"
127.0.0.1:6379> lrange mylist 0 -11) "a"2) "c"
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"127.0.0.1:6379> rrange mylist 0 -1
(error) ERR unknown command 'rrange' -- 不存在rrange命令
127.0.0.1:6379>
5. 类型4:集合类型 set : 不允许重复元素
- 存储:sadd key value
127.0.0.1:6379> sadd myset a -- 往myset中存元素
(integer) 1
127.0.0.1:6379> sadd myset a -- 存入相同元素失败
(integer) 0
- 获取:smembers key:获取set集合中所有元素
127.0.0.1:6379> smembers myset --遍历集合
1) "a"
- 删除:srem key value:删除set集合中的某个元素
127.0.0.1:6379> srem myset a -- 删除元素
(integer) 1
注意:存入和取出顺序不一致。
6. 类型5:有序集合类型 sortedset:
不允许重复元素,且元素有顺序。
每个元素都会关联一个double类型的分数。redis正是通过double分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
- 存储: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
- 获取:zrange key start end [withscores]
-- 遍历方式一
127.0.0.1:6379> zrange mysort 0 -11) "lisi"2) "zhangsan"3) "wangwu"
-- 遍历方式二
127.0.0.1:6379> zrange mysort 0 -1 withscores1) "zhangsan"2) "60"3) "wangwu"4) "80"5) "lisi"6) "500"
- 删除:zrem key value
127.0.0.1:6379> zrem mysort lisi
(integer) 1
- 代码
-- 添加三个元素
127.0.0.1:6379> zadd mysort 2 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 1 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 3 wangwu
(integer) 1
-- 遍历集合方式一(有序:根据double类型数字)
127.0.0.1:6379> zrange mysort 0 -11) "lisi"2) "zhangsan"3) "wangwu"
-- 遍历集合方式二
127.0.0.1:6379> zrange mysort 0 -1 withscores1) "lisi"2) "1"3) "zhangsan"4) "2"5) "wangwu"6) "3"
-- 移除元素wangwu
127.0.0.1:6379> zrem mysort wangwu
(integer) 1
-- 查看移除效果
127.0.0.1:6379> zrange mysort 0 -11) "lisi"2) "zhangsan"
127.0.0.1:6379>-- 修改lisi的位置(优先级)
127.0.0.1:6379> zadd mysort 800 lisi
(integer) 0
127.0.0.1:6379> zrange mysort 0 -1
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "2"
3) "lisi"
4) "800"
127.0.0.1:6379>
集合是通过哈希表
实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员
)。
7. 通用命令
Redis keys 命令
keys *
:查询所有的键
127.0.0.1:6379> keys *
1) "myset"
2) "mysort"
3) "password"
4) "username"
127.0.0.1:6379>
- type key:获取键对应的value的类型
127.0.0.1:6379> type username
string
127.0.0.1:6379> type mysort
zset
127.0.0.1:6379> type myset
set
127.0.0.1:6379>
- del key:删除指定的key value
127.0.0.1:6379> keys *1) "myset"2) "mysort"3) "password"4) "username"
127.0.0.1:6379> del password --删除指定的键
(integer) 1
127.0.0.1:6379> keys *1) "myset"2) "mysort"3) "username"
127.0.0.1:6379>
四、持久化
持久化: redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
以下介绍两种redis持久化机制
:两种方式启动服务器的时候均需要携带配置文件(redis.windows.conf
),方能生成持久化文件。
1、RDB:
- 配置文件默认方式,不需要进行配置,默认就使用这种机制。
- 在一定的间隔时间中,检测key的变化情况,然后持久化数据。
- 推荐使用,对性能影响较小。
(1)编辑redis.windwos.conf
文件(以下是默认持久化时间)
(2)重新启动redis服务器,并指定配置文件名称
D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>
redis-server.exe redis.windows.conf
双击打开客户端
示例:
对于已经持久化的文件,已经保存在磁盘,下次可以带配置文件直接访问。
2、AOF:
- 日志记录的方式,可以记录每一条命令的操作。
- 可以每一次命令操作后,持久化数据。
- 不推荐使用,对性能影响较大。
编辑redis.windwos.conf文件
-- 默认
> appendonly no(关闭aof) --> appendonly yes (开启aof)> # appendfsync always : 每一次操作都进行持久化
> appendfsync everysec : 每隔一秒进行一次持久化
> # appendfsync no : 不进行持久化
cmd启动服务器:
D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>
redis-server.exe redis.windows.conf
双击启动客户端
持久化保存在:appendonly.aof
文件里边。
3、Redis 持久化方式
五、Redis事务
1、什么是事务?特性?
Redis 事务可以一次执行多个命令。具有以下两个特性
事务的隔离性:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务的原子性:事务中的命令要么全部被执行,要么全部都不执行。
三特性?
单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行, 也就不存在”事务内的查要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
一个事务从开始到执行会经历以下三个阶段?
开启事务:以MULTI开始一个事务。
事务入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。
执行事务:由EXEC命令触发事务。
2、Redis 事务命令
下表列出了 redis 事务的相关命令:
序号 | 命令 | 描述 |
---|---|---|
1 | MULTI | 标记一个事务块的开始。 |
2 | EXEC | 执行所有事务块内的命令。 |
3 | DISCARD | 取消事务,放弃执行事务块内的所有命令。 |
4 |
WATCH key [key ...]
|
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
5 | UNWATCH | 取消 WATCH 命令对所有 key 的监视。 |
3、入门实例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUEDredis 127.0.0.1:6379> GET book-name
QUEUEDredis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUEDredis 127.0.0.1:6379> SMEMBERS tag
QUEUEDredis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"2) "C++"3) "Programming"
4、常见使用?
(1)情况1:正常执行
(2)情况2:放弃事务
(3)情况3:全体连坐
在事务块中只要有一条命令执行是错的,那么整个事务块就不会执行
(4)情况4:正常执行
如果在事务块中所有命令都正确,但是结果会产生错误,那么冤有头债有主,谁错找谁
(5)情况5:watch监控
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
① 初始化信用卡可用余额和欠额
② 无加塞篡改
先监控再开启multi, 保证两笔金额变动在同一个事务内
③ 有加塞篡改
监控了key,如果key被修改了,后面一个事务的执行失效
④ unwatch
一旦执行了unwatch之前加的监控锁都会被取消掉了
小结
Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变, 比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化, EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
六、Java客户端 Jedis
1、Jedis: 一款java操作redis数据库的工具.
使用步骤:
(1)下载jedis的jar包
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>compile</scope></dependency>
(2)使用
/*** 快速入门*/@Testpublic void test1(){//1.获取连接Jedis jedis = new Jedis("localhost",6379);//2.操作jedis.set("song","qiang");//3.关闭连接jedis.close();}
2、Jedis操作各种redis中的数据结构
(1)字符串类型 string
- set
- get
@Testpublic void test2(){//1.获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值为localhost,6379端口//2.操作jedis.set("song2","qiang2");//3.获取String song = jedis.get("song2");System.out.println("song2:"+song);/*** 可以使用setex(key,秒,value)方法存储可以指定夫妻时间key value* 将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对* * 应用:此链接24h内有效*/jedis.setex("activecode",20,"hehe");//4.关闭连接jedis.close();}song2:qiang2
(2)哈希类型 hash : map格式
- hset
- hget
- hgetAll
@Test
public void test5(){//1.获取连接Jedis jedis = new Jedis("localhost",6379);//2.操作jedis.hset("usermap","name","lisi");jedis.hset("usermap","age","22");jedis.hset("usermap","gender","男");//取出键为age的mapString age = jedis.hget("usermap", "age");System.out.println("age:"+age);//age:22//遍历所有mapMap<String, String> usermap = jedis.hgetAll("usermap");Set<String> keyset = usermap.keySet();for (String key : keyset) {String value = usermap.get(key);System.out.println(key+":"+value);}//3.关闭连接jedis.close();
}
gender:男
name:lisi
age:22
(3)列表类型 list : linkedlist格式。支持重复元素
- lpush / rpush
- lpop / rpop
- lrange start end : 范围获取
@Test
public void test3(){//1.获取连接Jedis jedis = new Jedis();//2.操作jedis.lpush("list","123","456","789");//从左边存jedis.rpush("list","a","b","c");//从右边存List<String> song = jedis.lrange("list", 0, -1);for (String s : song) {System.out.println(s);}String list = jedis.lindex("list", 1);//取出左边第二个元素System.out.println("list:"+list);String lpop = jedis.lpop("list");//删除左边第一个元素System.out.println("lpop:"+lpop);//3.关闭连接jedis.close();
}789
456
123
a
b
c
list:456
lpop:789
(4)集合类型 set : 不允许重复元素
- sadd
- smembers:获取所有元素
@Testpublic void test4(){//1.获取连接Jedis jedis = new Jedis("localhost");//2.操作jedis.sadd("myset","java","php","c#","c++");//获取全部元素Set<String> myset = jedis.smembers("myset");System.out.println("myset:"+myset);//3.关闭连接jedis.close();}
myset:[c#, c++, java, php]
(5)有序集合类型 zset(sortedset):不允许重复元素,且元素有顺序
- zadd
- zrange
- zrangeWithScores:获取tuple{score,element}
@Test
public void test6(){//1.获取连接Jedis jedis = new Jedis("localhost",6379);//2.操作jedis.zadd("mysortedset",3,"亚瑟");jedis.zadd("mysortedset",33,"猴子");jedis.zadd("mysortedset",333,"后裔");//遍历值Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);for (String s : mysortedset) {System.out.println(s);}System.out.println();Set<Tuple> zrangeWithScores = jedis.zrangeWithScores("mysortedset", 0, -1);for (Tuple zrangeWithScore : zrangeWithScores) {double score = zrangeWithScore.getScore();//获取scoreString element = zrangeWithScore.getElement();//获取element值System.out.println(score+":"+element);}System.out.println();//查找亚瑟的indexLong zrem = jedis.zrem("mysortedset", "猴子");System.out.println("zrem:"+zrem);//3.关闭连接jedis.close();
}亚瑟
猴子
后裔3.0:亚瑟
33.0:猴子
333.0:后裔zrem:1
(6)Redis Java Keys 实例
- keys()
- randomKey()
- ping()
@Test
public void test7(){//连接本地的 Redis 服务Jedis jedis = new Jedis("localhost");System.out.println("Connection to server sucessfully");//查看服务是否运行System.out.println("Server is running: "+jedis.ping());System.out.println();//随机弹出一个keyString randomKey = jedis.randomKey();System.out.println("ramdomKey:"+randomKey);System.out.println();//遍历所有keySet<String> keys = jedis.keys("*");for (String key : keys) {System.out.println("key:"+key);}}Connection to server sucessfully
Server is running: PONGramdomKey:mysetkey:usermap
key:mysortedset
key:list
key:song2
key:myset
key:usernameProcess finished with exit code 0
3、jedis连接池: JedisPool
(1)使用:
- 创建JedisPool连接池对象
- 调用方法 getResource()方法获取Jedis连接
(2)导入依赖
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.3</version></dependency>
(3)测试类
public class PoolTest {//连接池入门@Testpublic void test(){//0、创建一个配置对象JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(50);//最大连接数config.setMaxTotal(10);//最大空闲连接//public JedisPool(GenericObjectPoolConfig poolConfig, String host)//1、创建Jedis连接池对象JedisPool jedisPool = new JedisPool(config,"localhost");//2、获取连接Jedis jedis = new Jedis("localhost",6379);//3、使用jedis.set("haha","heihei");//4、关闭:归还到连接池中jedis.close();}@Testpublic void testPoolUtils(){//从连接池工具类中获取连接Jedis jedis = JedisPoolUtils.getJedis();//使用jedis.set("haizi","1234567890abcdefghijklmnopqrstuvwxyz");//关闭连接jedis.close();}}
(4)连接池工具类
/*** JedisPool工具类* 加载配置文件,配置连接池的参数* 提供获取连接的方法*/
public class JedisPoolUtils {private static JedisPool jedisPool;static {//1、读取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//2、创建Properties对象Properties properties = new Properties();try {properties.load(is);} catch (IOException e) {e.printStackTrace();}//3、获取数据,设置到JedisPoolConfig中JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.valueOf(properties.getProperty("maxTotal")));config.setMaxIdle(Integer.valueOf(properties.getProperty("maxIdle")));//4、创建Jedis连接池对象jedisPool = new JedisPool(config, properties.getProperty("host"),Integer.valueOf(properties.getProperty("port")));}/*** 获取连接的方法*/public static Jedis getJedis(){return jedisPool.getResource();}
}
(5)配置文件jedis.properties
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
目录结构
六、案例:
1、案例需求:
提供index.html页面,页面中有一个省份 下拉列表
当页面加载完成后 发送ajax请求,加载所有省份
2、注意:使用redis缓存一些不经常发生变化的数据。
数据库的数据一旦发生改变,则需要更新缓存。
- 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入。
- 在service对应的增删改方法中,将redis数据删除。
JAVA【21】Redis相关推荐
- 【redis-02】redis的五种数据类型和对应的操作方法,补充RedisUtil模板
[redis-02]redis的五种数据类型和对应的操作方法,补充RedisUtil模板 [一]redis的五种数据类型 [二]String:字符串常用命令 (1)String基本信息 (2)Stri ...
- 【承】Redis 原理篇——关于 Redis 中的事务
前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...
- 【锁】Redis锁 处理并发 原子性
[锁]Redis锁 处理并发 原子性 如果为空就set值,并返回1 如果存在(不为空)不进行操作,并返回0 很明显,比get和set要好.因为先判断get,再set的用法,有可能会重复set值. se ...
- 【承】Redis 原理篇——Redis 高性能深入剖析
前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...
- 【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command ‘PSETEX‘
[异常]redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'PSETEX' 参考文章: (1)[异常]red ...
- JAVA 【引用类型】和【对象类型】在【继承】中的异同
介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系 ...
- Java【并发】面试题
Java[并发]面试题 Java 线程 简述线程.进程.程序的基本概念? 程序 程序,是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码. ? 进程 进程,是程序的一 ...
- 面试-Java【之】(revers)递归实现字符串倒序排列(详解)
面试-Java[之](revers)递归实现字符串倒序排列(详解) 实现源码详解 <目录:Java-JDBC学习> <幕> 实现源码详解 public class Test { ...
- 【21】面向流水线的指令设计(下):奔腾4是怎么失败的?
[计算机组成原理]学习笔记--总目录 [21]面向流水线的指令设计(下):奔腾4是怎么失败的? 引言 一.重要知识点 1.CPU及计算机整机性能衡量标准[SPEC跑分程序]: 2.大家判断CPU性能的 ...
最新文章
- HarmonyOS shape 的使用
- php进程通讯 windows,windows-server-2008 – PHP进程一次运行一个,总是占用一个核心的100%...
- 石墨文档Websocket百万长连接技术实践
- python 虚拟环境依赖复制
- 双11,如果数据中心断网断电会怎样?
- pycharm shadows name 'xxxx' from outer scope 警告
- 又拍云引领云CDN加速 或成互联网刚性需求
- uC/OS-II 一些函数简介
- Java网络编程学习汇总
- 小米路由器挂php,小米路由器mini 安装openWrt+更新源+挂载U盘+安装python
- 统一用户认证和单点登录解决方案
- 数学物理方法 数学物理方程
- Java学习日记(一)
- js控制excel打印完美解决方案
- 第三只眼与另一个世界
- ionic框架中TABS中tabs-striped条形切换问题
- Notepad++ 设置tab为N个空格
- cml sml区别_资本市场线简介,资本市场线CML与SML的区别
- 腾讯云注册与实名图文教程
- 语法体系:快速区分同位语从句和定语从句day10