内容概要
因为项目中用户注册发送验证码, 需要学习 Redis 内存数据库, 故而下午花了些时间进行初步学习. 本博文性质属于对今日 Redis 学习内容的小结. 在看本博文前或者看完后, 可以反问自己三个问题: Redis 是什么 (What), 为什么要用 Redis/Redis 有什么用?(Why), 如何使用 Redis(How).
Redis 简述
Redis 安装与简单应用
- Jedis(Redis for Java)
- JedisPool(Jedis 数据库连接池)
- JedisUtil(Redis 简易封装的操纵工具)
- jedis.properties
- pulic static Jedis getJedis()
- public static void close(Jedis jedis)
注: JedisUtil 的设计及全部代码并非博主原创, 系完全摘抄自博客园博主 Roy-Xin https://www.cnblogs.com/xinruyi/ 的博文 Jedis 连接池 https://www.cnblogs.com/xinruyi/p/9391140.html
一 Redis 简述
简述全文摘抄自百度百科.
特点
支持网络 (远程)
基于内存
可持久化
日志型
Key-Value 数据库
提供多种语言
Redis 是一个 key-value 存储系统. 和 Memcached 类似, 它支持存储的 value 类型相对更多, 包括 string(字符串),list(链表),set(集合),zset(sorted set -- 有序集合) 和 hash(哈希类型). 这些数据类型都支持 push/pop,add/remove 及取交集并集和差集及更丰富的操作, 而且这些操作都是原子性的. 在此基础上, Redis 支持各种不同方式的排序. 与 Memcached 一样, 为了保证效率, 数据都是缓存在内存中. 区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件, 并且在此基础上实现了 master-slave(主从) 同步.
Redis 是一个高性能的 key-value 数据库. Redis 的出现, 很大程度补偿了 Memcached 这类 key/value 存储的不足, 在部 分场合可以对关系数据库起到很好的补充作用. 它提供了 Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang 等客户端, 使用很方便.
Redis 支持主从同步. 数据可以从主服务器向任意数量的从服务器上同步, 从服务器可以是关联其他从服务器的主服务器. 这使得 Redis 可执行单层树复制. 存盘可以有意无意的对数据进行写操作. 由于完全实现了发布 / 订阅机制, 使得从数据库在任何地方同步树时, 可订阅一个频道并接收主服务器完整的消息发布记录. 同步对读取操作的可扩展性和数据冗余很有帮助.
二 Redis 安装与简单应用
step1: 下载 Redis 安装包
https://github.com/microsoftarchive/redis/releases
step2: 解压即安装
step3: 运行服务端
D:\Program\Redis\Redis-server.exe D:\Program\Redis\Redis.Windows.conf # 运行 Redis 服务器
step4.1: 客户端调用 Redis(应用) 存储 / 获取数据 [基于 String 的 key-value 键值对]
- D:\Program\Redis\Redis-cli.exe -h 127.0.0.1 -p 6379 # 客户端调用 Redis 服务
- >set myKey abc
- OK
- >get myKey
- "abc"
step4.2: 密码问题
查看当前 Redis 有没有设置密码:(以下显示说明没有密码)
- 127.0.0.1:6379> config get requirepass
- 1) "requirepass"
- 2) ""
+ 设置密码 (方式一)
- 127.0.0.1:6379> config set requirepass abcdefg
- OK
+ 再次查看当前 Redis 就提示需要密码:
- 127.0.0.1:6379> config get requirepass
- (error) NOAUTH Authentication required.
+ 设置密码 (方式二: 永久)
+ 打开配置文件 : Redis.conf(假定设置为 123)
- requirepass foobared
- requirepass 123
+ 保存后重启 Redis 即可
step4.3: 远程服务调用 (需密码)
D:\Program\Redis\Redis-cli.exe -h <host:127.0.0.1> -p <port:6379> -a <password:123> # 客户端调用 Redis 服务
三 Jedis(Redis for Java)
jedis 是官方首选的 java 客户端开发包
Redis 不仅是使用命令来操作, 现在基本上主流的语言都有客户端支持, 比如 java,C,C#,C++,PHP,Node.JS,Go 等.
在官方网站里列一些 Java 的客户端, 有 Jedis,Redisson,Jredis,JDBC-Redis, 等其中官方推荐使用 Jedis 和 Redisson.
在企业中用的最多的就是 Jedis,Jedis 同样也是托管在 GitHub 上
项目地址: https://github.com/xetorthio/jedis
下载 jedis 解压后得到 jar 包如下: java 操作 Redis 数据库 API(Jedis)
基本用法
- // 连接 Redis 服务器, 192.168.0.100:6379
- String ip="192.168.0.100";
- jedis = new Jedis(ip, 6379);
- // 权限认证
- jedis.auth("password");
- Jedis API
[推荐] Jedis 常用方法 API
- public class RedisTest {
- @Test
- public void jedisPropertiesTest(){
- Jedis jedis = JedisUtil.getJedis();
- Print.print("ss:" + jedis.get("ss"));//output: ss:2423235
- JedisUtil.close(jedis);
- }
- @Test// 基于字符串存储的基本测试
- public void baseTest(){
- Jedis jedis = new Jedis("127.0.0.1",6379);
- jedis.auth("123456");
- // 设置数据
- jedis.set("zengtai","1125418540");
- jedis.set("wangchen","2153253568");
- jedis.close();// 释放资源
- Print.print("保存数据完成");
- // 获取数据
- Print.print("ss:" + jedis.get("ss"));//output: ss:2423235
- Print.print("xx:" + jedis.get("xx"));//output: xx:bhdjfsahsf
- jedis.close();// 释放资源
- Print.print("获取数据完成");
- // 删除数据
- jedis.del("xx");
- jedis.close();// 释放资源
- Print.print("删除数据完成");
- Print.print("xx:" + jedis.get("wangchen"));//output: xx:null
- }
- @Test// 数据结构测试 (栈 / 队列)
- public void dataStructureTest(){
- Jedis jedis = new Jedis("127.0.0.1",6379);
- jedis.auth("123456");
- // 设置数据
- jedis.lpush("charsList","E","D","C","B");// 添加 List:B(0) C(1) D(2) E(3)
- jedis.lpush("charsList","A");// 往 key 对应 list 左侧插入一个元素
- jedis.rpush("charsList","F");// 往 key 对应 list 左侧插入一个元素
- Print.print("rpop:"+jedis.rpop("charsList"));//output: rpop:F
- Print.print("lpop:"+jedis.lpop("charsList"));//output: lpop:A
- Print.print("charsList[0]:"+jedis.lindex("charsList",0));//output: charsList[0]:B
- Print.print("charsList[1]:"+jedis.lindex("charsList",1));//output: charsList[1]:C
- jedis.lset("charsList",0,"");// 修改 key 对应 list 指定下标 index 的元素
- Print.print("charsList[0]:"+jedis.lindex("charsList",0));//output: charsList[0]:
- jedis.close();// 释放资源
- }
- }
四 JedisPool(Jedis 数据库连接池)
+ [[推荐 (JedisUtil / 连接池 JedisPool)] Jedis 连接池](https://www.cnblogs.com/xinruyi/p/9391140.html)
- //1 获得连接池配置对象, 设置配置项
- JedisPoolConfig config = new JedisPoolConfig();
- // 1.1 最大连接数
- config.setMaxTotal(30);
- //1.2 最大空闲连接数
- config.setMaxIdle(10);
- // 获得连接池
- JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
- Jedis jedis = null;
- try {
- //3. 获得核心对象
- jedis = jedisPool.getResource();
- //4. 设置数据
- jedis.set("name", "xinruyi");
- //5. 获得数据
- String name = jedis.get("name");
- System.out.println(name);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- // 虚拟机关闭时, 释放 pool 资源
- if(jedisPool!=null){
- jedisPool.close();
- }
五 JedisUtil(Redis 简易封装的操纵工具)
实现 Redis 操纵 (JedisUtil 类) 所依赖的工具有:
Redis 数据库服务
Redis 安装 https://www.runoob.com/redis/redis-install.html
Redis 数据类型 https://www.runoob.com/redis/redis-data-types.html
Jedis(Redis for Java - API)
jedis 是官方首选的 java 客户端开发包
Redis 不仅是使用命令来操作, 现在基本上主流的语言都有客户端支持
比如 java,C,C#,C++,PHP,Node.JS,Go 等
在官方网站里列一些 Java 的客户端, 有 Jedis,Redisson,Jredis,JDBC-Redis 等
其中, 官方推荐使用 Jedis 和 Redisson
在企业中用的最多的就是 Jedis,Jedis 同样也是托管在 GitHub 上
地址: https://github.com/xetorthio/jedis
下载 jedis 解压后得到 jar 包如下: java 操作 Redis 数据库 API(Jedis)
- JedisPool(Jedis 连接池)
- ResourceBundle(读取属性配置文件 jedis.properties)
Properties 与 ResourceBundle 区别
参考文献
属性文件操作之 Properties 与 ResourceBundle https://www.cnblogs.com/tonghun/p/7124245.html
二者都可以读取属性文件中以 key/value 形式存储的键值对
ResourceBundle 读取属性文件时操作相对简单
- import Redis.clients.jedis.Jedis;
- import Redis.clients.jedis.JedisPool;
- import Redis.clients.jedis.JedisPoolConfig;
- import java.util.ResourceBundle;
- public final class JedisUtil {
- private JedisUtil() {
- }
- private static JedisPool jedisPool;
- private static int maxtotal;
- private static int maxwaitmillis;
- private static String host;
- private static int port;
- private static int timeout;
- private static String auth;// 密码
- /* 读取 jedis.properties 配置文件 */
- static {
- ResourceBundle rb = ResourceBundle.getBundle("jedis");
- maxtotal = Integer.parseInt(rb.getString("maxtotal"));
- maxwaitmillis = Integer.parseInt(rb.getString("maxwaitmillis"));
- host = rb.getString("host");
- port = Integer.parseInt(rb.getString("port"));
- auth = rb.getString("auth");
- timeout = Integer.parseInt(rb.getString("timeout"));
- }
- /* 创建连接池 */
- static {
- JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
- jedisPoolConfig.setMaxTotal(maxtotal);
- jedisPoolConfig.setMaxWaitMillis(maxwaitmillis);
- jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, auth);
- }
- /* 获取 jedis*/
- public static Jedis getJedis() {
- return jedisPool.getResource();
- }
- /* 关闭 Jedis*/
- public static void close(Jedis jedis) {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
jedis.properties [jedis(Redis for java) 连接池配置信息]
- maxtotal=100
- maxwaitmillis=3000
- host=127.0.0.1
- port=6379
- auth=123456
- timeout=1000
测试与示例
- @Test
- public void jedisPropertiesTest(){
- Jedis jedis = JedisUtil.getJedis();
- Print.print("aiqing:" + jedis.get("aiqing"));//output: aiqing:sdvwtrguyw32
- JedisUtil.close(jedis);// 释放资源
- }
六 参考文献
Redis 安装 - 菜鸟教程 https://www.runoob.com/redis/redis-install.html
Redis 密码设置和查看密码 https://www.cnblogs.com/suanshun/p/7699084.html
设置 Redis 访问密码
Redis 数据类型 - 菜鸟教程 https://www.runoob.com/redis/redis-data-types.html
Jedis 连接池 - 博客园 https://www.cnblogs.com/xinruyi/p/9391140.html
Jedis 常用方法 API - CSDN
来源: http://www.bubuko.com/infodetail-3107357.html