一、String
string类型是Redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至一张图片
- 一个string类型的值存储的最大容量是1GB
- string类型比较适合存储类型单一的数据
| 命令 | 格式 | 解释 |
|---|---|---|
| set | set key value | 给key设置一个value(字符串类型) |
| get | get key | 获取key的值 |
| incr | incr key | 对key的值递增+1(值必须是数字) |
| decr | decr key | 对key的值递减-1(值必须是数字) |
| strlen | strlen key | 获取key值的长度 |
二、Hash
hash类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他数据类型。内部是无序字典
- hash类型的值里面最多存储2的32次方-1个元素
2.1、应用场景
hash也可以同于对象存储,比如存储用户信息,与字符串不一样的是,字符串是需要将对象进行序列化(比如json序列化)之后才能保存,而Hash则可以将用户对象的每个字段单独存储,这样就能节省序列化和反序列的时间。比如:存储用户的购买记录,比如key为用户id,field为商品id,value为商品数量。
三、List
list是一个有序的字符串列表,列表内部是使用双向链表(linked list)实现的。
- list列表类型的值最多存储2的32次方-1个元素
- 插入、删除非常快,时间复杂度为O(1)
- 索引定位很慢,时间复杂度为O(n)
| 命令 | 格式 | 解释 |
|---|---|---|
| lpush | lpush key value | 从列表左侧添加元素 |
| rpush | rpush key value | 从列表右侧添加元素 |
| lpop | lpop key | 从列表左侧弹出元素 |
| rpop | rpop key | 从列表右侧弹出元素 |
| llen | llen key | 获取列表的长度 |
| lrange | lrange key start stop | 获取列表指定区间的元素 |
| lindex | lindex key index | 获取列表指定角标的元素 |
| lset | lset key index value | 修改列表中指定角标的元素 |
3.1、应用场景
lists应用场景非常多,它可以轻松的实现热销榜,可以实现工作队列(利用lists的push操作),将任务存在lists中,然后工作线程再用pop操作将任务取出进行执行。可以实现最新列表,比如最新评论。
lpush student zhangsan lisi wangwu
rpush student1 zhangsan lisi wangwu
可以采用lpush+rpop模拟先进先出的队列
左边进右边出
四、Set
Set集合中的元素都是不重复的,无序的
- set列表类型的值最多存储2的32次方-1个元素
- set能够提供判断一个成员是否在集合内的原因
| 命令 | 格式 | 解释 |
|---|---|---|
| sadd | sadd key value | 向集合中添加元素 |
| smembers | smembers key | 获取集合中所有元素 |
| srem | srem key value | 从集合中删除指定元素 |
| sismember | sismember key value | 判断集合中是否包含指定元素 |
| sdiff | sdiff key1 key2 | 获取两个集合的差集 |
| sinter | sinter key1 key2 | 获取两个集合的交集 |
| sunion | sunion key1 key2 | 获取两个集合的并集 |
| scard | scard key | 获取集合中元素的数量 |
4.1、应用场景
redis的sets类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作,可以利用这些集合操作,解决程序开发过程中很多数据集合间的问题,比如计算网站独立ip,用户画像中的用户标签,共享好友等功能。
五、SortedSet
有序集合,在集合类型的基础上位集合中每个元素都关联了一个分数
| 命令 | 格式 | 解释 |
|---|---|---|
| zadd | zadd key score value | 向集合中添加元素 |
| zscore | zscore key value | 获取集合中指定元素的分值 |
| zrange | zrange key start end | 获取集合的值并按照score从小到大排序,最小的在上面 |
| zreverange | zreverange key start end | 获取集合指定元素的排名(倒序) |
| zincrby | zincrby key num value | 给集合中指定元素增加分值 |
| zcard | zcard key | 获取集合中元素的数量 |
| zrem | zrem key value | 从集合中删除指定元素 |
5.1、应用场景
主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩等
六、代码实战
6.1、不使用redis连接池
package com.strivelearn.java.redis;
import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.JedisFactory;
/**
* @author strivelearn
* @version RedisOp.java, 2022年12月11日
*/
public class RedisOp {
public static void main(String[] args) {
DefaultJedisClientConfig config = DefaultJedisClientConfig.builder()
.password("xys6154@")
.build();
Jedis jedis = new Jedis("192.168.234.100", 6379, config);
String set = jedis.set("student", "zhangsan");
String student = jedis.get("student");
System.out.println(student);
jedis.close();
}
}
6.2、使用redis连接池
package com.strivelearn.java.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Redis连接池方式
*
* @author strivelearn
* @version RedisPoolOp.java, 2022年12月11日
*/
public class RedisPoolOp {
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//连接池最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//连接池创建的最大连接数
jedisPoolConfig.setMaxTotal(10);
//创建链接的超时时间
jedisPoolConfig.setMaxWaitMillis(2000);
//表示从连接池中获取链接的时候会测试一下,是否可用,这样可以保证取出的连接都是可用的
jedisPoolConfig.setTestOnBorrow(true);
//获取jedis连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.234.100", 6379);
//从jedis连接池取出一个链接
Jedis resource = jedisPool.getResource();
String zhangsan = resource.get("student");
System.out.println("student" + zhangsan);
//1.如果jedis是直接创建的单链接,此时表示直接关闭这个链接
//2.如果jedis是从连接池中获取的链接,此时会把这个链接返回给连接池
jedisPool.close();
}
}
6.3、封装Redis工具类
package com.strivelearn.java.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author strivelearn
* @version RedisUtils.java, 2022年12月11日
*/
public class RedisUtils {
//私有构造函数,禁止new操作
private RedisUtils() {
}
private static JedisPool jedisPool = null;
/**
* 获取redis链接
*
* @return
*/
public static synchronized Jedis getJedis() {
if (jedisPool == null) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//连接池最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//连接池创建的最大连接数
jedisPoolConfig.setMaxTotal(10);
//创建链接的超时时间
jedisPoolConfig.setMaxWaitMillis(2000);
//表示从连接池中获取链接的时候会测试一下,是否可用,这样可以保证取出的连接都是可用的
jedisPoolConfig.setTestOnBorrow(true);
//获取jedis连接池
jedisPool = new JedisPool(jedisPoolConfig, "192.168.234.100", 6379);
}
return jedisPool.getResource();
}
/**
* 归还redis链接
*
* @param jedis
*/
public static void returnResource(Jedis jedis) {
jedis.close();
}
}