安装MySQL的memcached插件,并从Java中访问

安装memcached插件到MySQL中

安装libevent-devel。
# yum -y install libevent-devel
2. 在my.cnf中添加memcache的配置
daemon_memcached_option = "-p11211"
daemon_memcached_engine_lib_name = innodb_engine.so
daemon_memcached_r_batch_size = 1
daemon_memcached_w_batch_size = 1
3. 安裝memcached插件
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
mysql> show plugins;

确认安装了名为daemon_memcached的插件。

建立测试用的表格。
mysql> use test
mysql> create table user (id varchar(16), passwd varchar(256), primary key(id)) engine=InnoDB;
mysql> insert into user (id, passwd) values ('user01', '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8');

在数据库中插入的密码字段的值是使用sha256算法加密后的”password”。

5. 使得可以通过memcache访问
mysql> insert into innodb_memcache.containers (`name`,`db_schema`,`db_table`,`key_columns`,`value_columns`,`flags`,`cas_column`,`expire_time_column`,`unique_idx_name_on_key`) VALUES ('user', 'test', 'user', 'id', 'passwd',0,0,0,'PRIMARY');
mysql> UNINSTALL PLUGIN daemon_memcached;INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

如果你通过telnet链接到127.0.0.1的11211端口,并输入”get @@user.user01″,如果返回一个sha256的字符串,那就可以了。

实现Java方面

请从以下网址下载spymemcached库: http://www.java2s.com/Code/Jar/s/Downloadspymemcached27jar.htm
当然,如果使用Maven也可以。

我用JavaEE的JAX-RS创建了一个RestAPI,用于在使用JSON进行POST时,如果有用户注册,返回状态码200,如果没有(即ID和Pass不匹配),返回状态码401。

package memcached;

import java.net.InetSocketAddress;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import net.spy.memcached.MemcachedClient;

@RequestScoped
@Path("/auth")
@Produces("application/json")
@Consumes("application/json")
public class Memcache {

    @POST
    public Response auth (Map<String, String> param) {
        ResponseBuilder response = null;
        try {
            MemcachedClient memcachedClient = new MemcachedClient (new InetSocketAddress("192.168.56.102", 11211));
            if ( sha256( param.get("password") ).equals( memcachedClient.get( "@@user." + param.get("id") ).toString() ) ) {
                response = Response.status(200);
            } else {
                response = Response.status(401);
            }
        } catch (Exception e) {
            response = Response.status(400);
        }
        return response.build();
    }

    private String sha256(String plaintext) throws Exception{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        StringBuilder sb = new StringBuilder();
        md.update(plaintext.getBytes());
        for (byte b : md.digest()) {
            String hex = String.format("%02x", b);
            sb.append(hex);
        }
        return sb.toString();
    }
}

「value_columns必须映射到CHAR、VARCHAR或BLOB列,因此无法直接在memcached中处理JSON字段(尝试telnet时可能有响应,但内容可能混乱)→https://dev.mysql.com/doc/refman/5.6/zh/innodb-memcached-internals.html
不确定是否可以通过CAST解决此问题,但请尽可能让其无需任何操作即可适应。>Oracle先生」

使用生成列功能,从JSON类型的列中生成TEXT类型的列,并将其指定为value_columns中。

mysql> create table userinfo (id varchar(16), infojson json, userinfo text as (cast(infojson as char) engine=InnoDB;
mysql> insert into innodb_memcache.containers (`name`,`db_schema`,`db_table`,`key_columns`,`value_columns`,`flags`,`cas_column`,`expire_time_column`,`unique_idx_name_on_key`) VALUES ('userinfo', 'test', 'userinfo', 'id', 'userinfo',0,0,0,'PRIMARY');
mysql> UNINSTALL PLUGIN daemon_memcached;INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

结果,不行!
虽然如果逆转(从text类型到json类型的生成列)可能可以做到,但是由于不能使用json函数进行更新查询,所以美味度减半。。

广告
将在 10 秒后关闭
bannerAds