Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
彩色的用java读写,然后存黑色的代码用的是redis客户端终端命令
- String(字符串)
-
string是Redis最基本的类型,它可以包含任何数据,一个键最大能存储512MB。
-
常用命令的时间复杂度为O(1),读写一样的快。
应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。
写:
redisTemplate.opsForValue().set(key, String.valueOf(value));
读:
redisTemplate.opsForValue().get(key);
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 设置缓存
* @param key 键
* @param value 值
* @param timeout 时长
* @param timeUnit 缓存时间的类型(时/分/秒)
*/
public void set(String key, Object value, Long timeout, TimeUnit timeUnit) {
// 写入String缓存
redisTemplate.opsForValue().set(key, String.valueOf(value));
// 设置缓存时效
if (timeout != null) {
if (timeUnit != null) {
redisTemplate.expire(key, timeout, timeUnit);
} else {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
}
}
/**
* 通过key获取value缓存
*/
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}
redis 127.0.0.1:6379> SET name "Hello redis!"
OK
redis 127.0.0.1:6379> GET name
"Hello redis!"
- List类型
应用场景:1.***消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)
写:
// 写入List缓存;rightPush和leftPusp的区别在于(在一个数的右边加入还是左边加入)
redisTemplate.opsForList().rightPushAll(key, value);
读:
redisTemplate.opsForList().range(key, 0, redisTemplate.opsForList().size(key));
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 设置List缓存
* @param key 键
* @param value 值
* @param timeout 时长
* @param timeUnit 缓存时间的类型(时/分/秒)
*/
public void setList(String key, List<String> value, Long timeout, TimeUnit timeUnit) {
// 写入List缓存;rightPush和leftPusp的区别在于(在一个数的右边加入还是左边加入)
redisTemplate.opsForList().rightPushAll(key, value);
// 在某段时间后失效
if (timeout != null) {
if (timeUnit != null) {
redisTemplate.expire(key, timeout, timeUnit);
} else {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
}
}
/**
* 通过key获取value缓存
*/
public List<String> getList(String key) {
List<String> value = redisTemplate.opsForList().range(key, 0, redisTemplate.opsForList().size(key));
return value;
}
0-3
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(lpush)或者尾部(rpush)。
127.0.0.1:6379> lpush mylist first
(integer) 1
127.0.0.1:6379> lpush mylist second
(integer) 2
127.0.0.1:6379> rpush mylist third
(integer) 3
127.0.0.1:6379> lrange mylist 0 3
1) "second"
2) "first"
3) "third"
- Set类型(不可重复的无序集合)
应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
写:
redisTemplate.opsForSet().add(key, value);
读:
redisTemplate.opsForSet().members(key);
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 设置List缓存
* @param key 键
* @param value 值
* @param timeout 时长
* @param timeUnit 缓存时间的类型(时/分/秒)
*/
public void setSet(String key, String[] value, Long timeout, TimeUnit timeUnit) {
// 写入Set缓存
redisTemplate.opsForSet().add(key, value);
// 在某段时间后失效
if (timeout != null) {
if (timeUnit != null) {
redisTemplate.expire(key, timeout, timeUnit);
} else {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
}
}
/**
* 通过key获取value缓存
*/
public Set<String> getSet(String key) {
Set<String> value = redisTemplate.opsForSet().members(key);
return value;
}
Redis的Set是string类型的无序集合,Set中的元素。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。添加成功返回1,失败返回0。以下实例展示如何存取Set:
127.0.0.1:6379> sadd mset element1
(integer) 1
127.0.0.1:6379> sadd mset element2
(integer) 1
127.0.0.1:6379> sadd mset element3
(integer) 1
127.0.0.1:6379> sadd mset element2
(integer) 0
127.0.0.1:6379> smembers mset
1) "element3"
2) "element2"
3) "element1"
- ZSet(不可重复的有序集合)
应用举例:
(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
(2)排行榜应用,根据得分列出topN的用户等。
SortedSet的意思是他的每一个元素是有顺序的,顺序根据其score来决定,如果socre一样,则按value排序。
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 设置List缓存
* @param key 键
* @param value 值
* @param timeout 时长
* @param timeUnit 缓存时间的类型(时/分/秒)
*/
public void setZSet(String key, Set<String> valueSet, Long timeout, TimeUnit timeUnit) {
int size = valueSet.size();
for(String value: valueSet){
redisTemplate.opsForZSet().add(key, value, size);
size--;
}
// 在某段时间后失效
if (timeout != null) {
if (timeUnit != null) {
redisTemplate.expire(key, timeout, timeUnit);
} else {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
}
}
/**
* 通过key获取value缓存
*/
public Set<String> getZSet(String key) {
Set<String> value = null;
if (redisTemplate.opsForZSet().size(key) != null){
value = redisTemplate.opsForZSet().reverseRange(key, 0, redisTemplate.opsForZSet().size(key));
}
return value;
}
zset的成员是唯一的,但分数(score)却可以重复。以下实例展示如何存取ZSet:
127.0.0.1:6379> zadd zset 0 element1
(integer) 1
127.0.0.1:6379> zadd zset 1 element2
(integer) 1
127.0.0.1:6379> zadd zset 5 element3
(integer) 1
127.0.0.1:6379> zadd zset 4 element4
(integer) 1
127.0.0.1:6379> zrangebyscore zset 0 5
1) "element1"
2) "element2"
3) "element4"
4) "element3"
- Hash(键值对集合)
应用场景:例如存储、读取、修改用户属性(name,age,pwd等)
应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。
写:
redisTemplate.opsForHash().putAll(key, value);
取:
redisTemplate.opsForHash().entries(key);
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 设置缓存
* @param key 键
* @param value 值
* @param timeout 时长
* @param timeUnit 缓存时间的类型(时/分/秒)
*/
public void set(String key, Map<String, String> value, Long timeout, TimeUnit timeUnit) {
// 写入Map缓存,
redisTemplate.opsForHash().putAll(key, value);
// 设置缓存时效
if (timeout != null) {
if (timeUnit != null) {
redisTemplate.expire(key, timeout, timeUnit);
} else {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
}
}
/**
* 通过key获取value缓存
*/
public Map<String, String> getMap(String key) {
Map<Object, Object> value = redisTemplate.opsForHash().entries(key);
Map<String, String> result = new HashMap<>();
for (Map.Entry<Object, Object> entry : value.entrySet()) {
result.put(entry.getKey().toString(), entry.getValue().toString());
}
return result;
}
要把一个Hash保存到redis中,遍历Map<String,String>,逐个调用hset(key,hashKey,hashValue),获取所有值有hgetAll(key)