好久没有更博了,最近学了redis,来做一波总结吧。
首先来科普一下nosql非关系型数据库吧
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
接下来扯一波CAP定理吧:
1、一致性(Consistency) (所有节点在同一时间具有相同的数据)
2、可用性(Availability) (保证每个请求不管成功或者失败都有响应)
3、分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP不能被同时满足。而Redis满足了CP。
接下来就到了Resis环节了。里面包含了5个关键字
/**
* key value
*/
String,
/**
* 类似linklist
*/
List,
/**
* 无序且不重复
*/
Set,
/**
* 有序
*/
Zset,
/**
*类似Map
*/
Hash
一些常见命令这里就不科普了,可以去百度API文档自己看,建议自己大部分都敲一遍,这样学Jedis就会轻松很多。
再聊下Redis得事务吧
Redis里面有一个watch关键字,Redis在开启事务后可以watch某个值,类似乐观锁。在下面这个场景。两个程序员都想改某条记录,一个人改了之后如果该条记录被监控另一个人再改则会报异常。让另一个程序员重新拉取该条记录在之前改的版本上重新改。
要不来聊下主从复制以及哨兵模式
首先Redis可以选择两种身份Master与Slave。
一台Mater可以有多个Slave。Slave可以读到主机得所有数据。为了减轻主机负担一般会去中心化。让从机变成另一台从机得“主机”。中途转向会清除之前得数据,重新拷贝最新得数据。
那什么是哨兵模式呢
一组哨兵可以监控多个主机,若master挂了,会在slave投票选出一个做master,之前得master回来会变成现在得master得slave.(讲的有点绕)。
下面就来聊下Jedis吧,这是依赖
下面就直接上代码了,都很简单。可以有选择得大概看下
public class TestApi {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost",6379);
System.out.println(jedis.ping());
/**
* 字符串
*/
// jedis.set("k1","v1");
// jedis.set("k2","v2");
// jedis.set("k3","v3");
//
// System.out.println(jedis.get("k1"));
// Set<String> set = jedis.keys("*");
// System.out.println(set.size());
//
// for (String string : set) {
// System.out.println(string);
// }
//
// System.out.println(jedis.exists("k1"));
// System.out.println(jedis.ttl("k4"));
// System.out.println("-------------------------------------------");
//
// jedis.mset("str1","v1","str2","v2","str3","v3");
// System.out.println(jedis.mget("str1","str2","str3"));
System.out.println("--------------------------------------------");
/**
* list
*/
//类似入栈,先进后出
//jedis.lpush("mylist","3");
List<String> list = jedis.lrange("mylist", 0, -1);
System.out.println(list);
System.out.println("--------------------------------------------");
/**
* set 不可重复
*/
//jedis.sadd("orders", "jd001","jd002","jd003");
//获得改key里面得所有元素
Set<String> set2 = jedis.smembers("orders");
for (String string : set2) {
System.out.println(string);
}
System.out.println("---------------------------------------------");
/**
* hash
*/
//jedis.hset("users","user1","wyy");
System.out.println(jedis.hget("users", "user1"));
Map<String, String> map = new HashMap<String, String>();
map.put("user1", "wyy");
map.put("user2", "wyy2");
map.put("user3", "wyy3");
map.put("user4", "wyy4");
//jedis.hmset("users2", map);
System.out.println(jedis.hmget("users2", "user1","user2","user3"));
/**
* zset
*/
// jedis.zadd("telephones", 1d, "13142998212");
// jedis.zadd("telephones", 2d, "13142998213");
// jedis.zadd("telephones", 3d, "13142998214");
// jedis.zadd("telephones", 4d, "13142998215");
Set<String> set3 = jedis.zrange("telephones", 0, -1);
System.out.println(set3);
}
}
接下来了解下Redis连接池吧下面是自己写的工具类,大哥别喷就简单写写
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil() {
}
public static JedisPool getJedisPoolInstance() {
if(null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if(null == jedisPool) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(1000);
jedisPoolConfig.setMinIdle(32);
jedisPoolConfig.setMaxWaitMillis(100*1000);
jedisPoolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
}
}
}
return jedisPool;
}
public static void release(JedisPool jedisPool,Jedis jedis) {
if(null != jedis) {
jedisPool.close();
}
}
}
接下来是测试代码,可以参考下
public static void main(String[] args) {
JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.set("aa","bb");
} catch (Exception e) {
e.printStackTrace();
}finally {
JedisPoolUtil.release(jedisPool, jedis);
}
}