Redis笔记

一、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文件

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值