Redis缓存Mysql模拟用户登录Java实现实例
2016-06-23 14:55
841 查看
这段时间在研究Redis,作为缓存界的新宠,现在使用它的公司越来越多。本文使用的是最新稳定版Redis3.0.实现的具体逻辑是:
1. 用户登录首先判断是否在redis缓存中,如果在redis缓存中,直接登录成功;
2. 若用户未在redis缓存,则访问Mysql,判断用户是否存在,如果不存在,则提示用户注册;如果存在,则登录成功;
3. 在mysql存在并登录成功的同时,将改条数据用Redis Hash类型进行缓存,并设置过期时间为30分钟;
4. 设置redis最大内存,若超出内存范围,则使用FIFO方式进行清除。
本文实现方式为最简单的模拟方式,有的代码有进一步封装得必要。
工具/原料
Redis,Mysql
Java
方法/步骤
一、首先创建两个类,一个类连接Mysql,一个类连接Redis,并复写相关方法:
public class Mysql {
public Connection conn;
{
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost/spring","root","root");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class Redis extends Jedis {
public Jedis redis;
{
redis = new Jedis("192.168.217.128", 6379);
redis.auth("root");
}
// public static void main(String[] args) {
// System.out.println(redis.get("name"));
// System.out.println(redis.keys("*"));
// // redis.sinter(keys);
// }
public String get(String key) {
return redis.get("name");
}
public String set(String key, String value) {
return redis.set(key, value);
}
public Long del(String... keys) {
return redis.del(keys);
}
// 键值增加字符
public Long append(String key, String str) {
return redis.append(key, str);
}
public Boolean exists(String key) {
return redis.exists(key);
}
// Need research
public Long setnx(String key, String value) {
return redis.setnx(key, value);
}
public String setex(String key, String value, int seconds) {
return redis.setex(key, seconds, value);
}
public Long setrange(String key, String str, int offset) {
return redis.setrange(key, offset, str);
}
public List<String> mget(String... keys) {
return redis.mget(keys);
}
public String mset(String... keys) {
return redis.mset(keys);
}
public Long msetnx(String... keysvalues) {
return redis.msetnx(keysvalues);
}
public String getset(String key, String value) {
return redis.getSet(key, value);
}
public String hmset(String key, Map<String, String> hash) {
return redis.hmset(key, hash);
}
public Map<String, String> hgetall(String key) {
return redis.hgetAll(key);
}
public String hget(final String key, final String field) {
return redis.hget(key, field);
}
public Long hset(final String key, final String field, final String value) {
return redis.hset(key, field, value);
}
public Long expire(final String key, final int seconds) {
return redis.expire(key, seconds);
}
public Boolean hexists(final String key, final String field) {
return redis.hexists(key, field);
}
}
二、逻辑具体实现:
public class Main {
Mysql mysql=new Mysql();
Redis redis=new Redis();
ResultSet rs=null;
//模拟登陆缓存
@Test
public void redisLogin() throws SQLException{
//正常业务的ID是通过UI的request.getParamenter()获取
String id="9028935b527d22cc01527d235aea0142";
String sql="select * from user where id_='"+id+"'";
String username;
if(redis.hexists("user_"+id, "username_")){
username=redis.hget("user_"+id, "username_");
System.out.println("Welcome Redis! User "+username+" login success");
}else{
rs=mysql.conn.createStatement().executeQuery(sql);
if(rs.next()==false){
System.out.println("Mysql no register, Please register first");
}else{
username=rs.getString("username_");
System.out.println("Welcome Mysql ! User "+username+" login success");
redis.hset("user_"+id, "username_", username);
//30分钟未操作就过期
redis.expire("user_"+id, 1800);
}
}
}
}
以下是运行结果截图:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=13996840219759ee4a5060cb82fa434e/14ce36d3d539b600219003faee50352ac65cb724.jpg)
![](http://b.hiphotos.baidu.com/exp/w=500/sign=c0479265902bd40742c7d3fd4b889e9c/728da9773912b31b7932c1648118367adab4e125.jpg)
![](http://h.hiphotos.baidu.com/exp/w=500/sign=eba1c9623d292df597c3ac158c305ce2/7e3e6709c93d70cf4488a640ffdcd100baa12b08.jpg)
![](http://d.hiphotos.baidu.com/exp/w=500/sign=9296b8b63edbb6fd255be5263925aba6/cefc1e178a82b90189dccf7e748da9773912ef0e.jpg)
4
三、 设置最大内存:
在redis.conf文件中找到并设置即可:
maxmemory 10240000
来自:http://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html
1. 用户登录首先判断是否在redis缓存中,如果在redis缓存中,直接登录成功;
2. 若用户未在redis缓存,则访问Mysql,判断用户是否存在,如果不存在,则提示用户注册;如果存在,则登录成功;
3. 在mysql存在并登录成功的同时,将改条数据用Redis Hash类型进行缓存,并设置过期时间为30分钟;
4. 设置redis最大内存,若超出内存范围,则使用FIFO方式进行清除。
本文实现方式为最简单的模拟方式,有的代码有进一步封装得必要。
工具/原料
Redis,MysqlJava
方法/步骤
一、首先创建两个类,一个类连接Mysql,一个类连接Redis,并复写相关方法:public class Mysql {
public Connection conn;
{
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost/spring","root","root");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class Redis extends Jedis {
public Jedis redis;
{
redis = new Jedis("192.168.217.128", 6379);
redis.auth("root");
}
// public static void main(String[] args) {
// System.out.println(redis.get("name"));
// System.out.println(redis.keys("*"));
// // redis.sinter(keys);
// }
public String get(String key) {
return redis.get("name");
}
public String set(String key, String value) {
return redis.set(key, value);
}
public Long del(String... keys) {
return redis.del(keys);
}
// 键值增加字符
public Long append(String key, String str) {
return redis.append(key, str);
}
public Boolean exists(String key) {
return redis.exists(key);
}
// Need research
public Long setnx(String key, String value) {
return redis.setnx(key, value);
}
public String setex(String key, String value, int seconds) {
return redis.setex(key, seconds, value);
}
public Long setrange(String key, String str, int offset) {
return redis.setrange(key, offset, str);
}
public List<String> mget(String... keys) {
return redis.mget(keys);
}
public String mset(String... keys) {
return redis.mset(keys);
}
public Long msetnx(String... keysvalues) {
return redis.msetnx(keysvalues);
}
public String getset(String key, String value) {
return redis.getSet(key, value);
}
public String hmset(String key, Map<String, String> hash) {
return redis.hmset(key, hash);
}
public Map<String, String> hgetall(String key) {
return redis.hgetAll(key);
}
public String hget(final String key, final String field) {
return redis.hget(key, field);
}
public Long hset(final String key, final String field, final String value) {
return redis.hset(key, field, value);
}
public Long expire(final String key, final int seconds) {
return redis.expire(key, seconds);
}
public Boolean hexists(final String key, final String field) {
return redis.hexists(key, field);
}
}
二、逻辑具体实现:
public class Main {
Mysql mysql=new Mysql();
Redis redis=new Redis();
ResultSet rs=null;
//模拟登陆缓存
@Test
public void redisLogin() throws SQLException{
//正常业务的ID是通过UI的request.getParamenter()获取
String id="9028935b527d22cc01527d235aea0142";
String sql="select * from user where id_='"+id+"'";
String username;
if(redis.hexists("user_"+id, "username_")){
username=redis.hget("user_"+id, "username_");
System.out.println("Welcome Redis! User "+username+" login success");
}else{
rs=mysql.conn.createStatement().executeQuery(sql);
if(rs.next()==false){
System.out.println("Mysql no register, Please register first");
}else{
username=rs.getString("username_");
System.out.println("Welcome Mysql ! User "+username+" login success");
redis.hset("user_"+id, "username_", username);
//30分钟未操作就过期
redis.expire("user_"+id, 1800);
}
}
}
}
以下是运行结果截图:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=13996840219759ee4a5060cb82fa434e/14ce36d3d539b600219003faee50352ac65cb724.jpg)
![](http://b.hiphotos.baidu.com/exp/w=500/sign=c0479265902bd40742c7d3fd4b889e9c/728da9773912b31b7932c1648118367adab4e125.jpg)
![](http://h.hiphotos.baidu.com/exp/w=500/sign=eba1c9623d292df597c3ac158c305ce2/7e3e6709c93d70cf4488a640ffdcd100baa12b08.jpg)
![](http://d.hiphotos.baidu.com/exp/w=500/sign=9296b8b63edbb6fd255be5263925aba6/cefc1e178a82b90189dccf7e748da9773912ef0e.jpg)
4
三、 设置最大内存:
在redis.conf文件中找到并设置即可:
maxmemory 10240000
来自:http://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html
相关文章推荐
- redis各参数含义
- redis常用命令集合
- java(优化14) 15天玩转redis之第七篇
- Python Redis [How to] : Cache Python MySQL Result using Redis
- redis之dict
- ServiceStack.Redis 使用教程
- redis3 集群配置(一)
- windows下安装redis
- 微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core视频 代码 面试题
- Redis服务端配置总结
- Redis-stat的安装与使用
- ServiceStack.Redis常用操作 - 事务、并发锁_转
- ServiceStack.Redis 之 IRedisTypedClient 04_转
- Spring Data Redis 让 NoSQL 快如闪电 (1)
- Spring Data Redis 让 NoSQL 快如闪电 (1)
- ServiceStack.Redis之IRedisClient 03_转
- redis for hash操作简单总结
- Redis常用命令速查 02_转
- Redis 安装与简单示例 01_转
- windows下安装redis以及测试 Window 下安装