redis pipeline+lua+es

redis pipeline

可以一次性插入多个key的数据

 @RequestMapping(value = "/add/pipeline", method = RequestMethod.GET)
    public void addpipeline() {
        stringRedisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                for (int i = 0; i < 10; i++) {
                    connection.set(("pipel:" + i).getBytes(), "123".getBytes());
                }
                return null;
            }
        });
    }

redis lua

根据脚本插入数据,插入数据分为 eval和evalsha,evalsha是将脚本存到缓存中,等到插入数据的时候调用缓存。eval直接调用脚本

 @RequestMapping(value = "/lua", method = RequestMethod.GET)
    public void redislua(){
        DefaultRedisScript<Void> redisScript = new DefaultRedisScript<>();
        redisScript.setLocation(new ClassPathResource("redis.lua"));
        stringRedisTemplate.execute(redisScript, Collections.singletonList("key1"), new String[]{"value1" });
    }

源码是先调用的evalsha,不可以在用eval

 protected <T> T eval(RedisConnection connection, RedisScript<T> script, ReturnType returnType, int numKeys, byte[][] keysAndArgs, RedisSerializer<T> resultSerializer) {
        Object result;
        try {
            result = connection.evalSha(script.getSha1(), returnType, numKeys, keysAndArgs);
        } catch (Exception var9) {
            if (!ScriptUtils.exceptionContainsNoScriptError(var9)) {
                throw var9 instanceof RuntimeException ? (RuntimeException)var9 : new RedisSystemException(var9.getMessage(), var9);
            }

            result = connection.eval(this.scriptBytes(script), returnType, numKeys, keysAndArgs);
        }

        return script.getResultType() == null ? null : this.deserializeResult(resultSerializer, result);
    }

redis.lua 放到resource下面,KEYS[1]是能够取出key,ARGV是为了取出值。

return redis.call('set',KEYS[1],ARGV[1])

elasticsearch

1.倒排索引
与数据库的对应
ElasticSearch Index(索引) Type(类型) Document(文档) Fiedls(字段)
MySQL Database(数据库) Table(表) Row(行) Column(列)
2.postman查询所有的索引
http://127.0.0.1:9200/_cat/indices?v
redis pipeline+lua+es
3.添加索引:get
4.删除索引:delete
5.添加数据内容:
需要通过post添加数据
post:不是幂等性的,每次返回的_id不同
put:是幂等性的,每次添加的id需要相同

redis pipeline+lua+es
6.更新数据内容
用put全量更新数据,put是幂等性,更新数据唯一
redis pipeline+lua+es
用post更新部分数据,请求改成_update
redis pipeline+lua+es
更改之后的数据
redis pipeline+lua+es
删除数据,只能删除一次,再次删除会发现not_found

redis pipeline+lua+es
查询指定数据
redis pipeline+lua+es
查询确定字段的数据
当查询字段比如华为手机,因为包含手机,会把小米手机也查询出来
redis pipeline+lua+es

查询全量数据
redis pipeline+lua+es
选择从第二页开始,只显示“title”字段

redis pipeline+lua+es
按照价格price顺序查询数据
{
“query”:{
“match_all”:{

    }
},
"from":2,
"size":2,
"_source":["price"],
"sort":{
    "price":{
        "order":"desc"
    }
}

}

上一篇:Jenkins 基础篇 - 插件安装


下一篇:smtp-pipeline命令