对于redis来说key必须是Stringl类型的,他们的value类似hashMap
hash叫散列类型,它提供了字段和字段值的映射。
**redis hash存储比关系数据库的好处?**
两者都可以存放对象,对于关系型数据库来说,存储数据比较严格,有事务控制,安全性高。
但是关系型数据库在并发压力下性能很低,所以使用redis hash类型可以在一定程序上替代关系型数据库,因为redis单机并发量支持10w+
常见命令:
**设值,取值**
127.0.0.1:6380> hset user:1 username '张三'
(integer) 1
127.0.0.1:6380> hset user:1 password 123456
(integer) 1
127.0.0.1:6380> hmget user:2 username userpass
1) "admin"
2) "123456"
127.0.0.1:6380>
HEXISTS 判断是否存在该字段
127.0.0.1:6380> HEXISTS user:2 username
(integer) 1
HSETNX 字段存在返回,不存在则设值
127.0.0.1:6380> HSETNX user:2 usernames 'lisi'
(integer) 1
**增加数字HINCRBY **
127.0.0.1:6380> HSETNX user:2 age 23
(integer) 1
127.0.0.1:6380> HINCRBY user:2 age 2
(integer) 25
删除一列
127.0.0.1:6380> HDEL user:1 username
(integer) 1
只获取字段名或字段值
127.0.0.1:6380> HKEYS user:1
1) "password"
127.0.0.1:6380> HKEYS user:2
1) "username"
2) "userpass"
3) "usernames"
4) "age"
假设数据库有1K个商品记录,如何使用redis缓存,使用hash缓存
// 假设数据库有1K个商品记录,如何使用redis缓存,使用hash缓存
// key命名Goods:商品Id
List<Goods> list = new ArrayList();
/**
* 假数据
*/
Goods goods1 = new Goods();
goods1.setId(1);
goods1.setName("iphonex");
Goods goods2 = new Goods();
goods2.setId(2);
goods2.setName("iphonexsmax");
list.add(goods1);
list.add(goods2);
for (Goods goods : list) {
String key = "goods:";
key = key + goods.getId();
Map<String, String> value = new HashMap();
// 可以通过反射来写
Class clazz = Goods.class;
Field[] arrays = clazz.getDeclaredFields();
for (Field field : arrays) {
// 取属性名
String fieldName = field.getName();
// 获取get方法名
String getter = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
// 得到get方法对象
Method get = clazz.getMethod(getter);
// 通过属性的get方法取到当前goods对象的属性值
String fieldValue = get.invoke(goods) + "";
value.put(fieldName, fieldValue);
}
jedis.hmset(key, value);
}
}