一、Redis:高性能的key-value数据库,与其他的key-value数据库相比,有以下优势
1.1支持数据的持久化,可将数据写于硬盘中,重启的时候重新进行加载使用,性能极高:读的速度10W次/s,写的速度:8W次/s
1.2数据类型丰富:除了支持string,还有list、set、sortset、map等数据类型的存储
1.3支持数据备份,即master-slave模式
需要注意的是:尽管no_sql的访问速度快,但是都是基于key已知的情况下。
1.4支持服务的publish/subscrible
二、Redis的数据类型
2.1 String类型:一个key对应一个value,一个键最大能存储512M
set strName "value"; get name;
2关于String的相关命令: 设置key值——set keyname value; 获取key值——get keyname
获取子字符串——getrange keyname start end
2.2 Map哈希类型:key=>value,value以键值对的形式存在,每个hash可以存储2的32次方-1;
HMset mapName filed1 value1 field2 value2; HGET mapName field1; HGET mapName field2;
2.3 List类型 :按照插入顺序排序,列表最多可以存储2的32次方-1
lpush listName value1;lpush listName value2; lpush listName value3;
2.4 Set类型:添加一个string类型的值于set中,成功放回1;如果该值已经存在,则返回0;如果key对应的set不存在则返回错误
集合中的2的32次方-1
sadd smembers
2.5 sortSet类型:与set的区别是,关联一个double的分数score,value不能重复,但是score可以重复
zadd keyname score value ; zrangebyscore keyname score1 score2
2.6 HyperLogLog类型:海量数据的运算。计算速度快,所需内存小
pfadd key value; pfcount keyname;
pfmerge keyname keyname2 将二者进行合并。
以下为关于redis的java操作相关代码
package com.yang.redis;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class RedisTest {
public static void main(String [] args){
//连接到本地服务
Jedis jedis = new Jedis("127.0.0.1");
System.out.println("本地链接。。。");
//查看本地是否链接成功
System.out.println("状态:"+jedis.ping());
//关于数据类型string的操作
stringTest(jedis);
//关于数据类型为map的操作
mapTest(jedis);
//关于数据类型list的操作
listTest(jedis);
//关于数据类型为set的操作
setTest(jedis);
//关于数据类型sorted set的操作
sortedSetTest(jedis);
//关于数据类型Hyperloglog的操作
hyLoglogTest(jedis);
}
public static void stringTest(Jedis jedis){
jedis.set("person","yangcp");
System.out.println(jedis.get("person"));
}
public static void mapTest(Jedis jedis){
Map<String,String> map = new HashMap<String,String>();
map.put("name","yangcp");
map.put("height","130");
map.put("age","26");
jedis.hmset("yangcp",map);
System.out.println(jedis.hmget("yangcp","age"));
}
public static void listTest(Jedis jedis){
//每次插入的时候,都将该元素放置至array的第一位
jedis.lpush("yangcp's habit","reding");
jedis.lpush("yangcp's habit","trip");
System.out.println(jedis.lrange("yangcp's habit",0,0));//所以结果为“trip”
}
public static void setTest(Jedis jedis){
jedis.sadd("yangcp's plan","plan A","plan B","plan C", "plan B");
System.out.println(jedis.smembers("yangcp's plan"));
System.out.println(jedis.srandmember("yangcp's plan",2));
}
public static void sortedSetTest(Jedis jedis){
jedis.zadd("yangcp's plans",0,"plan B");
jedis.zadd("yangcp's plans",0,"plan A");
jedis.zadd("yangcp's plans",0,"plan C");
System.out.println(jedis.zrange("yangcp's plans",0,10));
}
public static void hyLoglogTest(Jedis jedis){
jedis.pfadd("yangcp's tony","pig","dog","cat");
System.out.println(jedis.pfcount("yangcp's tony"));
}
}
三、redis的发布与订阅功能
3.1 发布消息:publish redisChannelName message
3.2 订阅消息:subscribe redisChannelName1 [redisChannelname2]
四、redis的事务
前面我们提到redis的原子性操作,只是针对于redis的单个命令,对于redis的事务来说,它不是原子性的。
当批量操作多个命令的时候,其中某个命令的成功或者失败,不会影响前面的命令的回滚或者终止后面的命令的执行。
以MULTI开启事务,然后将命令插入队列中,最后以EXEC触发事务,开启事务中的所有命令。
事务相关命令:MULTI:开启事务;DISCARD:取消事务;EXEC:执行事务
五、redis数据的备份与恢复
使用SAVE命令即可将数据以.rdb的文件格式保存到redis安装目录下:dump.rdb
下次重新启动redis的时候,就会自动加载该文件。
六、redis分区
分区是将一个key对应的数据分散到多个redis实例中。
作用:可以使用多个机器的内存,将数据的处理分散到多个机器上去处理,通过简单的增加计算机的数量达到运行内存的增加;
分类:范围分区——假设有4个实例:R0,R1,R2,R3;
一批数据user:1;user:2...user:n,将数据分为n/10000组,每组放到一个实例中;不过需要建一张表维护实例与对应数据之间的映射关系
散列分区——使用散列函数将key转换为一个数字NUM,然后对数字进行取模,然后将值n1存入到对应的实例中。
key——NUM NUM%n=n1;
缺点:对于多个key的操作,如果存在不同的实例中,则无法取交集;
同时操作多个key的时候,则无法进行redis事务
数据处理较为复杂,比如数据的备份:不同实例的rdb文件