Redis基础
Redis个人文档(1)
Redis的基本安装
Linux下安装(CentOS7)
- 下载gcc依赖
- 上传安装包并解压(/usr/local/src)
- 进入redis目录
- 编译
yum install -y gcc tcl
# 此处上传redis文件
tar -xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make && make install
Redis 客户端(windows)
在连接时先写好redis的基本配置
安装完成后运行即可
Redis的基本配置文件
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问Redis必须输入密码
requirepass 123321
# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
Redis命令行客户端
# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
# 配置了密码,需要通过 -u 来指定密码
redis-cli -u 123321 shutdown
# 进入redis安装目录
cd /usr/local/src/redis-6.2.6
# 启动
redis-server redis.conf
redis-cli [options] [commonds]
-h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
-p 6379:指定要连接的redis节点的端口,默认是6379
-a 123321:指定redis的访问密码
ping 心跳测试
也可以直接登录,在页面内通过AUTH指定密码
AUTH 4285
Redis常见的数据结构和相关命令
通用命令
- *为通配符
- keys Pattern 查看符合模板的所以key
- del keyName 删除指定keyname,多个用空格隔开
- exists KeyName 查询制定key是否存在
- expire KeyName seconds 给某个key指定一个有效期
- ttl KeyName 查询一个key的有效时间(-1是永久有效 , -2是已过期)
key的层级结构
Redis的Key允许有多个单词组成的层级结构,多个单词之间用:
隔开,如
项目名:业务名:类型:id
这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。
从而避免了key的冲突问题。
例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:
user相关的key:heima:user:1
product相关的key:heima:product:1
- 基本类型
String
细分的类型
String普通字符串
int整数型
float浮点型
Hash
散列,其value是一个无序字典,类似与java中的HaspMap结构
List
近似双向链表结构,既可以支持正向检索也可以支持反向检索
特征:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
- BLPOP阻塞式获取,会有一个等待的时间
- 可以用List结构模拟有栈(出入口在同一边) , 模拟一个队列(出入口不在同一边), 阻塞队列(出入口不在同一边,并且有阻塞时间)
Set
与HaskSet类似,本质也是一个Hask表
特征:
- 无序
- 元素不可以重复
- 支持交集,并集,差集等功能
- 查询快
逻辑命令(多集合操作):
SortedSet
可以排序的Set集合,可以通过score属性对元素进行排序,底层是跳表加hash表
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:
升序获取sorted set 中的指定元素的排名:ZRANK key member
降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber
- 特殊的数据类型
- GEO(地理坐标)
- BitMap(位存储)
- HyperLog
Redis的Java客户端
Jedis ,以Redis命令做方法名称 , 但Jedis实例的线程是不安全的
主流用Lettuce , 基于Netty
Spring Data Redis => 同时兼容Jedis 和 Lettuce(在学习分布式锁时细)
Jedis
引入maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
建立Jedis连接
void setup(){
//建立连接
jedis = new Jedis("121.41.54.154" , 6379);
//设置密码
jedis.auth("4285");
//选择库
jedis.select(0);
//编写Redis语句
String result = jedis.set("name", "cosh");
System.out.println("result = " + result);
String name = jedis.get("name");
System.out.println(name);
if(jedis != null) jedis.close();
}
Jedis的命令全是基于Redis的命令来写的,直接根据Java提示来写既可
Jedis连接池配置文件:
public class Pool {
private static final JedisPool jedispool;
static {
//配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大连接数量
poolConfig.setMaxTotal(8);
//最多预备8个连接
poolConfig.setMaxIdle(8);
//最少预备连接
poolConfig.setMinIdle(2);
//等待时长
poolConfig.setMaxWaitMillis(1000);
//创建连接池对象
jedispool = new JedisPool(poolConfig , "121.41.54.154" , 6379 , 1000 , "4285");
}
public static Jedis getJedis() {
return jedispool.getResource();
}
}
获取连接池的连接和归还连接
//获取连接
jedis = Pool.getJedis();
//关闭连接
jedis.close();
Spring Data Redis
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
application.yml设置:
spring:
redis:
host: 121.41.54.154
port: 6379
password: 4285
lettuce:
pool:
max-active: 8 # 最大连接数量
max-idle: 8 # 最大空闲连接
min-idle: 2 # 最小空闲连接
max-wait: 100 # 最长等待时间
编写测试类:
@Resource
RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("name" , "newCosh");
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}
Redis序列化
由于SpringData在传入参数时会以字节化的形式传入,这时候传入时会默认转化成二进制文件
修改值的序列化:
建立一个Configuration(白学警告)
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
//创建RedisTemplate对象
RedisTemplate<String , Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(connectionFactory);
//设置Key序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置Value序列化
template.setValueSerializer(RedisSerializer.json());
template.setHashValueSerializer(RedisSerializer.json());
//返回
return template;
}
}
在序列化中消除@class进入json串的构造,此时需要手动完成序列化和反序列化
此时可以借助SpringBoot自带的工具类完成转换
@Autowired
private StringRedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("name:1:aaa" , JSON.toJSONString(new TestClass("123" , "123")));
}
本文链接:
/archives/redisji-chu
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
cosh'blog!
喜欢就支持一下吧