Redis安装完成后就自带了命令行客户端:redis-cil,使用方式如下:
redis-cli [options] [commands]
其中常见的options有:
-h 127.0.0.1
:指定要连接的redis节点的IP地址,默认是127.0.0.1-p 6379
:指定要连接的redis节点的端口,默认是6379-a 123321
:指定redis的访问密码通用指令是部分数据类型,都可以使用的指令,常见的有:
通过help[command]可以查看一个命令的具体用法
String类型,也就是字符串类型,是Redis中最简单的存储类型
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m(1/2GB)
常见命令:
Redis的key允许有多个单词形成层级结构,多个单词之间用:
隔开,格式如下:
项目名:业务名:类型:id
这个格式并非固定,也可以根据自己的需求来删除或添加词条
例如我们的项目名称叫heima,有user和product两种不同类型的数据,我们可以这样定义key
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
常见命令
Redis中的List类型与Java中的LinkedList类似,可以看作是一个双向链表结构。既可以支持正向检索,也可以支持反向检索。
特征也与LinkedList类似:
常见命令:
如何利用List结构模拟一个栈
如何利用List结构模拟一个队列?
如何利用List结构模拟一个阻塞队列?
Redus的Set结构与Java中的HashSet类似,可以看作是一个value为null的HashMap。因为也是一个Hash表,因此具备与HashSet类似的特征:
常见命令
小练习:
张三的好友有:李四、王五、赵六
SADD zs lisi wangwu zhaoliu
李四的好友有:王五、麻子、二狗
SADD ls wangwu mazi ergou
计算张三的好友有几人
SCARD zs
计算张三和李四有哪些共同好友
SINTER zd ls
查询哪些人是张三的好友却不是李四的好友
SDIFF zs ls
查询张三和李四的好友总共有哪些人
SUNION zs ls
判断李四是否是张三的好友
SISMEMBER zs lisi
判断张三是否是李四的好友
SISMEMBER ls zhangsan
将李四从张三的好友列表中移除
SREM zs lisi
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkiList)加hash表。
SortedSet具备下列特性:
常见命令
练习
将班级的下列学生得分存入Redis的SortedSet中:
Jack 85,Lucy 89, Rose 82, Tom 95 , Jerry 78, Amy 92, Miles 76
ZADD stus 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
删除Tom同学
ZREM stus Tom
获取Amy同学的分数
获取Rose同学的排名
ZRANK stus Rose
查询80分以下有几个学生
ZCOUNT stus 0 80
给Amy同学加2分
ZINCRBY stus 2 Amy
查出成绩前3名的同学
ZRANGE stus 0 2
查出成绩80分以下的所有同学
ZRANGEBYSCORE stus 0 80
亲爱的spring整合了Jedis和lettuce,名为Spring Data Redis
Jedis的官网地址:https://github.com/redis/jedis
1、引入依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>3.7.0version>
dependency>
2、创建Jedis对象,建立连接
private Jedis jedis;
@BeforeEach
void setUp(){
//建立连接
jedis = new Jedis("ip地址",6379);
//设置密码
jedis.auth("123321");
//选择库
jedis.select(0);
}
3、使用Jedis,方法名与Redis命令一致
@Test
void testString(){
//插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name","张三");
System.out.println("result = "+result);
//获取数据
String name = jedis.get("name");
System.out.println("name = "+ name);
}
4、释放资源
@AfterEach
void tearDown(){
//释放资源
if(jedis != null){
jedis.close();
}
}
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。
public class JedisConnectionFactory{
private static final JedisPool jedisPool;
static{
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大连接
jedisPoolConfig.setMaxTotal(8);
//最大空闲连接
jedisPoolConfig.setMaxIdle(8);
//最小空闲连接
jedisPoolConfig.setMinIdle(0);
//设置最长等待时间,ms
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig,"ip地址",6379, 1000,"123321");
}
//获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
SpringDataRedis是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作,并且将不同数据类型的操作API封装到了不同的类型中:
1、引入依赖
<dependency>
<groupId>org.springfranework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
2、配置文件
spring:
redis:
host:192.168.150.101
port:6379
password:123321
lettuce:
pool:
max-active:8 # 最大连接
max-idle:8 # 最大空闲连接
min-idle:0 # 最小空闲连接
max-wait:100 # 连接等待时间
3、注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4、编写测试
@SpringBootTest
public class RedisTest{
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString(){
//插入一条string类型数据
redisTemplate.opsForValue().set("name","李四");
//读取一条string类型数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
当我们在Java程序中插入name键以及需要的值,但是在redis中却没有保存下来,显示的还是原先在redis上操作的值
而查询所有键时发现一个前面有着很长前缀后面加上的是我们java程序中使用的键名
但是查询他的值,却不是我们想要的值。这个值被剁碎了
RedisTemplate可以接受任意Object作为值写入Redis,只不过写入之前会把Objet序列化为字节形式,默认是采用JDK序列化,得到的记过就很奇奇怪怪
缺点:
所以需要重写他底层的序列化方式
@Bean
public RedisTemplate<String, Object> redisTemplate (RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//创建Template
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer():
//key和hashKey采用string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
//value和hashValue采用JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}