Redis中哈希结构就如同Java的map一样,一个对象里面有许多键值对,它是特别适合存储对象的,如果内存足够大,那么一个Redis的hash结构可以存储40多亿。在Redis中,hash是一个String类型的field和value的映射表,因此我们存储的数据实际在Redis内存中都是一个个字符串而已。
假设角色有3个字段:编号(id)、角色名称(roleName)和备注(note),这样就可以使用一个hash结构保存它。它的内存结果如下所示:
role_1
id: 001
roleName:role_name_001
note:note_001
在Redis中他就是这样的结构,其中role_1代表的是这个hash结构在Redis内存的key,通过它就可以找到这个hash结构,而hash结构由一系列的field和value组成。hash的键值对在内存中是一种无序的状态,我们可以通过键找到对应的值。
Redis hash结构命令:
- hdel key field1 [field2…]:删除hash结构中的某个或某些字段,可以进行多个字段的删除。(删)
- hexists key field:判断hash结构中是否存在field字段,存在返回1,否则返回0。
- hgetall key:获取所有hash结构中的键值,返回键和值。(查)
- hincrby key field increment:指定给hash结构中的某个字段加上一个整数,要求该字段也是整数字符串。
- hincrbyfloat key field imcrement:指定给hash结构中的某个字段加上一个浮点数,要求该字段是数字型字符串。
- hkeys key:返回hash中所有的键。(查)
- hlen key:返回hash中键值对的数量。(查)
- hmget key field1 [field2…]:返回hash中指定的键的值,可以是多个,依次返回值。(查)
- hmset key field1 value1 [field2 value2…]:hash结构设置多个键值对。(增,改)
- hset key field value:在hash结构中设置键值对,单个设值。(增)
- hsetnx key field value:当hash结构中不存在对应的键,才设置值。(增)
- hvals key:获取hash结构中所有的值。(查)
现在我们用一个例子来使用Spring去操作Redis得hash结构,由于Spring对Redis进行了封装,所以有必要对RedisTemplate的配置项进行修改。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="50" />
<property name="maxTotal" value="100" />
<property name="maxWaitMillis" value="20000" />
</bean>
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="6379" />
<property name="password" value="123456" />
<property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultSerializer" ref="stringRedisSerializer" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
</bean>
</beans>
然后我们编写一个方法去操作Redis。代码如下:
package com.ssm.redis1.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.*;
public class testRedisHash {
public static void main(String[] args){
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("redisSpring-cfg.xml");
RedisTemplate redisTemplate=applicationContext.getBean(RedisTemplate.class);
String key="hash";
Map<String,String> map=new HashMap<String,String>();
map.put("f1","val1");
map.put("f2","val2");
//相当于hmset命令
redisTemplate.opsForHash().putAll(key,map);
//相当于hset命令
redisTemplate.opsForHash().put(key,"f3","6");
printValueForhash(redisTemplate,key,"f3");
//相当于hexists key filed命令
boolean exists=redisTemplate.opsForHash().hasKey(key,"f3");
System.out.println(exists);
//相当于hgetall命令
Map keyValMap=redisTemplate.opsForHash().entries(key);
//相当于hincrby命令
redisTemplate.opsForHash().increment(key,"f3",2);
printValueForhash(redisTemplate,key,"f3");
//相当于hincrbyfloat命令
redisTemplate.opsForHash().increment(key,"f3",0.88);
printValueForhash(redisTemplate,key,"f3");
//相当于hvals命令
List valueList=redisTemplate.opsForHash().values(key);
//相当于hkeys命令
Set keyList=redisTemplate.opsForHash().keys(key);
List<String> fieldList=new ArrayList<>();
fieldList.add("f1");
fieldList.add("f2");
//相当于hmget命令
List valueList2=redisTemplate.opsForHash().multiGet(key,keyList);
//相当于hsetnx命令
boolean success=redisTemplate.opsForHash().putIfAbsent(key,"f4","val4");
System.out.println(success);
//相当于hdel命令
Long result=redisTemplate.opsForHash().delete(key,"f1","f2");
System.out.println(result);
}
private static void printValueForhash(RedisTemplate redisTemplate, String key, String f3) {
//相当于hget命令
Object value=redisTemplate.opsForHash().get(key,f3);
System.out.println(value);
}
}
运行结果: