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";

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

上一篇:Handler Timer TimerTask ScheduledExecutor 循环任务解析


下一篇:Metasploit各版本对比