因为项目中用户注册发送验证码,需要学习redis内存数据库,故而下午花了些时间进行初步学习。本博文性质属于对今日redis学习内容的小结。在看本博文前或者看完后,可以反问自己三个问题:Redis是什么(What)、为什么要用Redis/Redis有什么用?(Why)、如何使用Redis(How)。
简述全文摘抄自百度百科。
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可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
>set myKey abc
OK
>get myKey
"abc"
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即可
//连接redis服务器,192.168.0.100:6379
String ip="192.168.0.100";
jedis = new Jedis(ip, 6379);
//权限认证
jedis.auth("password");
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,"<X>");//修改key对应list指定下标index的元素
Print.print("charsList[0]:"+jedis.lindex("charsList",0));//output: charsList[0]:<X>
jedis.close();//释放资源
}
}
+ [【推荐(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();
}
实现Redis操纵(JedisUtil类)所依赖的工具有:
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);//释放资源
}
原文:https://www.cnblogs.com/johnnyzen/p/11105406.html