前言
本文为学习Redis的一个总结,包含了资料的整理,Redis的介绍,常用数据类型,常用命令,多数据库与事务的特性以及持久化的概述;如何在Linux上部署,以及使用Java客户端开发工具包来连接使用Redis,并记录了常见的问题,关于Redis的高级特性与使用场景后续开新文章进行补充。
参考资料(记录与分享)
视频教程教常用命令、数据类型、Jedis简单使用、事务与持久化简单概述,属于入门级别:
这篇很全的概述,包含特性、场景、还有基本的用法,都是概述性的简要说明:
这篇稍微有点高级,哈哈哈:
可以在线的测试一些学会的命令:
redis.conf相关的,懒翻译配置文件中英语就看他吧 :
在Linux上搞Redis的参考:
Redis介绍&使用场景&特点&缺点
(参考资料里,别人总结的很好,过去看看就好了,重要的再粘过来。)
数据类型&常用操作
数据类型
- 字符串 String 【二进制存储,最大512M】
- 哈希 Hash
- 字符串列表 List
- 字符串集合 Set
- 有序字符串集合(Sorted Set)
命令操作【这块重点】
Redis的Java客户端开发包
Jedis介绍
- Jedis是Redis官方首选的Java客户开发包
- GitHub地址
- Jedis中的操作方法基本上和Redis的操作命令是一致的
Jedis 代码测试
Maven&JUint单元测试依赖
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
A candy:在线查询Maven依赖
简单的连接测试
import org.junit.Test; import redis.clients.jedis.Jedis; public class JedisTest { /** * Jedis的简单使用 */ @Test public void demo(){ //设置IP地址以及端口 Jedis jedis = new Jedis("192.168.121.128",6379); //保存数据 jedis.set("name","菜鸟"); //获取数据 String value = jedis.get("name"); //打印数据 System.out.println(value); //释放资源 jedis.close(); } }
使用连接池
import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisTest { /** * 使用连接池 */ @Test public void demoPoll(){ //连接池配置 JedisPoolConfig config = new JedisPoolConfig(); //最大连接数 config.setMaxTotal(30); //最大空余连接数 config.setMaxIdle(10); //根据 config host port 创建连接池 JedisPool jedisPool = new JedisPool(config,"192.168.121.128",6379); //获取核心对象 Jedis jedis = null; try { jedis = jedisPool.getResource(); //设置数据 jedis.set("name","弱鸡"); //获取数据 String value = jedis.get("name"); System.out.println(value); }catch (Exception e){ e.printStackTrace(); }finally { //释放资源 if(jedis != null){ jedis.close(); } if(jedisPool != null){ jedisPool.close(); } } } }
问题&解决方案
Linux上安装启动问题
Make报错
直接 make 如果报错,则执行
make MALLOC=libc
;然后./redis-server
启动的一个小问题,还是要说一下
教程里面的redis版本低的原因吧,启动是
./bin/redis-server
我用的时候都在src目录下,而非bin,所以不进入目录情况下带目录名启动应该是./src/redis-server
Jedis连接不上的问题
Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案
为什么如上更改了配置还报错? 启动的时候记得加载配置文件
./redis-server ./redis.conf
连接超时
原因:Linux 上的6379端口没有打开,需要在防火墙中打开该端口
设置Linux的端口开放:
(1)vim /etc/sysconfig/iptables
(2)
-A INPUT -m state -- state NEW -m tcp -p --dport 6379 -j ACCEPT
[可以yy复制22端口那行然后,p粘贴]
(3)重启防火墙设置:
service iptables restart
多数据库与事务特性
多数据库
- select 1 选择数据库 默认是0库
- 移动某个key到其他数据库 move key 1
事务
也就是命令串行化、原子化执行,似的数据具有一致性
- 开启事务 multi
- 提交事务 exec
- 回滚事务 discard
Redis的持久化
Redis之所以快,就是他的数据存储在了内存中(难怪多了会崩),为了能够重启Redis后数据仍然能够存在并读取使用,就需要将数据存储到磁盘里。
两种方式:
- RDB 方式
- AOF 方式
RDB方式
优势:
- 数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
- 压缩文件转移到其他介质上
- 性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
,避免服务器进程执行I/O操作,启动效率高
劣势:
- 无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
- 通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
配置:
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下
AOF方式
优势:
同步:
a. 每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
b. 每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
c. 不同步日志写入操作追加模式append
a.系统宕机,不影响存在的内容
b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
格式清晰的日志文件,完成数据的重建
劣势:
- 对于相同数据文件,相比RDB,A OF文件较大
- 效率低
配置:
vim redis.conf
默认:
appendonly no #AOF方式默认关闭
appendfilename appendonly.aof #配置文件
appendfsync always #每修改一次,同步到磁盘上
appendsync everysec 每秒同步到磁盘一次
appensync no 不同步