zoukankan      html  css  js  c++  java
  • 2018/1/9 redis学习笔记(一)

    本文不涉及redis基本命令以及javaapi的解释操作;

    首先介绍下redis,一个nosql非关系型数据库,运行在缓存中,特点就是可存储的数据结构类型很多,做为KEY-VALUE数据库,它的键只能是String,而值则可以是String,Set,Hash,List,sorted set;

    String类型就是字符串,Set的话就是存取无序并且不可重复的集合,Hash是一个HashMap集合,一个保存field映射到value映射关系的映射表,value是Set数据类型;但是有一点要注意的是,redis里的Hash创建的存储对象是hashtable,但存储的数据结构则是zipmap;相比普通的map存储,zipmap占用的内存更少,但因为是压缩数据,对其进行操作时要先进行解压,所以效率要低一些.List则是双向链表,我们可以用来实现队列和堆栈数据结构.sorted set的话,就是有序的set,并且可以自定义区间保存数据;

    redis持久化方式:

    一:快照方式(默认持久化方式)

    就是在一定时间进行一定次数的操作后(次数和时间可自选,详情百度)自动将redis内存中的所有数据(是所有,而不是对比落地数据和缓存数据后保存新增数据)持久化到dump.rdb文件中,当然客户端也可以手动更新,使用save和bgsave,但要注意的是,redis是单线程程序,所以在手动save的时候会阻塞所有客户端请求.

    二:日志追加方式

    这种方式就是redis每收到一个写命令都会追加到appendonly.aof文件中,并可手动配置持久方方案,需要在配置文件中自行设置.此种方式默认是关闭的;

    如何使用redis命令达到类似sql查询语句的效果???

    一个具体代码例子:

     private static final msex = "man";

    private static final  wsex= "woman";

    private static fin  age = "25";

    private static Jedis jedis =  new Jedis("192.....","6379");

    public void test(){

    String mtwperson = gson.formObj(new person("man",25);

    String womtwperson = gson.formObj(new person(woman,"25"));

    String mtsperson =  gson.formObj(new person("man","26"));

    Map map = new HashMap();

    String UUID1 = new UUID.tostring();

    map.put(UUID1,mtwperson );

    jedis.sadd("msex",);

    String UUID2 = new UUID.tostring();

    jedis.sadd("age",UUID1 );

    jedis.sadd("msex",mtsperson );

    .......//后面实在懒得写了,反正就是这么个思路,一个uuid对应一个person对象,然后根据条件将uuid加到相应的set集合中.之后以uuid为键,person对象为值,存入map中,最后将map存入redis中.

    这样就能利用并集交集等操作来进行一个条件判断了;

    }

    再之后就是利用Lua脚本来对redis进行操作;
    下载lua脚本就不说了,我是在linux上进行操作的,具体百度,不过别忘记想yum -y install gcc 来安装下载gcc,因为lua是C语言写的,而C和C++程序都需要进行编译;

    下面来直接写下具体的语法吧.

    print("Hello World");

    使用lua lua1.lua运行此脚本;会打印出Hello World;文件名后缀无所谓,linux无视后缀名,只是一个规范标识,但最好加上,这样以后使用通配正则进行批量操作比较方便;

    使用redis进行操作

    redis.call("set","name","yangfei");

    local name = redis.call("get","name");//local相当于声明这是一个局部变量,因为lua不允许全部变量

    return name;//是否return无所谓.和shell脚本一样,不return就会返回nil;

    运行 redis-cli --eval lua2.lua

    意味使用redis客户端解析运行脚本;

    打印出 yangfei,同时在redis中查看会发现已经有了键为name值为yangfei的数据;

    现在来点稍微复杂的吧;

    local name = redis.call("get",KEYS[1]);

    local age = redis.call("get",KEYS[2]);

    if name == "yangfei" then 

    redis.call("set",KEYS[1],AGRV[1]);

    print(age);

    end

    运行 redis-cli --eval lua3.lua name age , yf  //这里的话就是传参,和shell脚本不同的是lua脚本是有键值区别的,符号也不同,shell中使用的是{1},{2};

    打印出22,同时在redis中查看会发现yangfei 变为了yf;

    lua脚本还有表格形式

    local t1 = {};

    t1.name = "yangfei";

    t1[age] = 22;

    t1[3] = "man";

    ....//写的好累,我还是直接截图在朋友圈吧;

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/yangfeiORfeiyang/p/8258011.html
Copyright © 2011-2022 走看看