您的位置:首页 > 数据库 > Redis

redis增大查询速度(项目中实际应用举例)

2017-08-23 01:56 881 查看
1、关于保存User表的方案

1.1 使用Redis的Hash类型去保存关系型数据库的User表

1.2 redis的Hash的key为"SYS_USER_TABLE_SEX_MAN",field:userid value:json 数据

2、利用Redis的Set来保存满足一类条件的User用户的id信息。例如,性别为女,年龄大于25岁等条件。

3、Java实现的具体代码如下:

3.1 Json相关的工具类

public class GsonUtil {
public static String object2Json(Object object) {
Gson gson = new Gson();
return gson.toJson(object);
}

public static <T> T json2Object(String json, Class<T> clazz) {
Gson gson = new Gson();
return gson.fromJson(json, clazz);
}
}


3.2 User实体类

public class User {
private int id;
private String name;
private String sex;
private int age;

public User() {
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
+ age + "]";
}

}


3.3 Redis实现类似SQL的多条件查询测试

public class RedisSQL {
public static void main(String[] args) {

// 将User表的内容放到Redis里面,下面为key
// 将User表的内容field:id value: json 保存一个记录
final String SYS_USER_TABLE = "SYS_USER_TABLE";
// 用于保存性别为男性的User用户的Redis的Set
final String SYS_USER_TABLE_SEX_MAN = "SYS_USER_TABLE_SEX_MAN";
// 用于保存性别为女性的用户的Redis的Set
final String SYS_USER_TABLE_SEX_FEMAN = "SYS_USER_TABLE_SEX_FEMAN";
// 用于保存age为25岁的用户的Redis的Set
final String SYS_USER_TABLE_AGE_25 = "SYS_USER_TABLE_AGE_25";
// 获取数据库的连接
Jedis jedis = new Jedis("192.168.2.116", 6379);

// 模拟数据库的表User的数据
List<User> users = new ArrayList<User>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i);
user.setName("zhang" + i);
user.setSex("man");
user.setAge(20 + i);
users.add(user);
}
for (int i = 5; i < 10; i++) {
User user = new User();
user.setId(i);
user.setName("zhang" + i);
user.setSex("feman");
user.setAge(20 + i);
users.add(user);
}

// 通过Hash存放
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < users.size(); i++) {
map.put(users.get(i).getId() + "",
GsonUtil.object2Json(users.get(i)));

// 将性别为男性的User用户
// 加入到Redis中key为SYS_USER_TABLE_SEX_MAN的Set集合里面
// 只需要加入User用户的id就可以了
if ("man".equals(users.get(i).getSex())) {
jedis.sadd(SYS_USER_TABLE_SEX_MAN, users.get(i).getId() + "");
}
// 将性别为男性的User用户
// 加入到Redis中key为SYS_USER_TABLE_SEX_MAN的Set集合里面
// 只需要加入User用户的id就可以了
if ("feman".equals(users.get(i).getSex())) {
jedis.sadd(SYS_USER_TABLE_SEX_FEMAN, users.get(i).getId() + "");
}
// 如果有age,birthday等,使用类似的方法
// 在Redis里面,新建立一个Set,用来保存符合条件的相关User的id信息
if ("25".equals(users.get(i).getAge() + "")) {
jedis.sadd(SYS_USER_TABLE_AGE_25, users.get(i).getId() + "");
}
}
// 查看转换结果
// Set<String> keySet = map.keySet();
// for (String key : keySet) {
// System.out.println(map.get(key));
// }

// 保存User表的数据到Redis中
// key为SYS_USER_TABLE
// 每条记录一 feild :id value:json 的形式保存
jedis.hmset(SYS_USER_TABLE, map);

// ===============================
// 模拟SQL的where多条件查询
// 查询年龄为25岁,性别为女的user用户
Set<String> sinter = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN);
for (String key : sinter) {
// 根据id到Redis中的SYS_USER_TABLE,查询符合条件的user
String hkey = jedis.hget(SYS_USER_TABLE, key);
System.out.println(hkey);
// 将查询到的json数据,转换为User用户
User user = GsonUtil.json2Object(hkey, User.class);
System.out.println(user);

}

// 查询年龄为25岁,性别为女的user用户
Set<String> sinter2 = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN,
SYS_USER_TABLE_AGE_25);
for (String key : sinter2) {
// 根据id到Redis中的SYS_USER_TABLE,查询符合条件的user
String hkey = jedis.hget(SYS_USER_TABLE, key);
System.out.println(hkey);
// 将查询到的json数据,转换为User用户
User user = GsonUtil.json2Object(hkey, User.class);
System.out.println(user);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: