本文不涉及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";
....//写的好累,我还是直接截图在朋友圈吧;