先说一下利用的redis命令,哈希(Hash)---Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
看下存储结果,就会一目了然。
我们可以将loginName设置为key,其他字段信息用json字符串放到value中。此时,key就相当于我们的id,value就相当于一个长文本,里面是所有字段信息。通过key获取到value,然后解析json字符串,就可以获取到user表信息。
我们可以将某些数据库表数据缓存到redis中,既可以提高查询数据速度,又可以减轻数据库压力。
命令及例子:
命令:hset key_name field value(将哈希表 key 中的字段 field 的值设为 value )
hget key field(获取存储在哈希表中指定字段的值)
hlen key(获取哈希表中字段的数量,类似于count(id) )
hvals key(获取哈希表中所有值,类似于 select * from user )
例子:hset hash_key_user ross '{"name":"ross","age":"20"}'
hget hash_key_user ross
hlen hash_key_user
hvals hash_key_user
java中的使用:
1,在redisUtils中封装redis命令 ,RedisUtils见https://blog.csdn.net/scorpio_meng/article/details/95459384
/**
* 如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。
* 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。
* @param key
* @param filed
* @param value
* @param indexdb
* @return
*/
public static Long hset(String key,String filed,String value,int indexdb) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.select(indexdb);
return jedis.hset(key,filed,value);
} catch (Exception e) {
logger.error("hset错误日志:"+e.getMessage());
return 0L;
} finally {
jedis.close();
}
}
/**
* 获取存储在哈希表中指定字段的值
* 也可以获取某个对象值
* @param key
* @param filed
* @param indexdb
* @return
*/
public static String hget(String key,String filed,int indexdb) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.select(indexdb);
return jedis.hget(key,filed);
} catch (Exception e) {
logger.error("hset错误日志:"+e.getMessage());
return null;
} finally {
jedis.close();
}
}
/**
* 获取哈希表中字段的数量
* 也可以用于获取对象个数
* @param key
* @param indexdb
* @return
*/
public static Long hlen(String key,int indexdb) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.select(indexdb);
return jedis.hlen(key);
} catch (Exception e) {
logger.error("hlen错误日志:"+e.getMessage());
return 0L;
} finally {
jedis.close();
}
}
/**
* 获取哈希表中所有值
* 也可以获取所有对象的list集合
* @param key
* @param indexdb
* @return
*/
public static List<String> hvals(String key, int indexdb) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.select(indexdb);
return jedis.hvals(key);
} catch (Exception e) {
logger.error("hvals错误日志:"+e.getMessage());
return null;
} finally {
jedis.close();
}
}
2,接口中的调用
@GetMapping(value = "/test_hash_user")
public Long testHashUser(){
UserRedis userRedis = new UserRedis();
userRedis.setName("jack");
userRedis.setAge("25");
userRedis.setSex("1");
userRedis.setCity("上海");
return
RedisUtils.hset("hash_key_user","jack",JSONObject.toJSONString(userRedis),0);
}
@GetMapping(value = "/test_hash_user_get")
public JSONObject getHashUser(){
String result = RedisUtils.hget("hash_key_user","jack",0);
JSONObject jsonObject = JSONObject.parseObject(result);
return jsonObject;
}
@GetMapping(value = "/test_hash_user_len")
public Long getHashLen(){
return RedisUtils.hlen("hash_key_user",0);
}
@GetMapping(value = "/test_hash_user_list")
public List<JSONObject> getHashList(){
List<String> userList = RedisUtils.hvals("hash_key_user",0);
List<JSONObject> jsonObjectList = new ArrayList<>();
if (userList != null && userList.size() > 0) {
for (int i = 0; i < userList.size(); i++) {
String userObj = userList.get(i);
jsonObjectList.add(JSONObject.parseObject(userObj));
}
}
return jsonObjectList;
}
3,用到的UserRedis实体类
public class UserRedis implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String sex;
private String age;
private String city;
//get、set自行添加
@Override
public String toString() {
return "{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", age='" + age + '\'' + ", city='" + city + '\'' + '}';
}
}
4,测试结果
hset测试
hget测试
hlen测试(为了测试多个,请修改filed和value后,再set一条数据),查询结果为2
hvals测试