特点:非结构化、无关联、非SQL、没有事务或事务不满足ACID特性、内存存储、支持水平扩展
redis官网:https://redis.io/
一个基于内存的键值型NoSQL数据库
key-value型
单线程,每个命令具备原子性
低延迟,速度快(基于内存、IO多路复用、c语言编写)
支持数据持久化
支持主从/分片集群
支持多语言客户端
下载redis安装包
在http://download.redis.io/releases/下载需要的版本,比如6.2.6
服务器安装gcc依赖
yum install -y gcc tcl
上传安装包
上传targz到/usr/local/src目录,解压
安装
进入redis目录,执行
make && make install
检查是否安装成功
默认安装目录:/usr/local/bin
编辑/usr/local/src/redis-6.2.6/redis.conf
# 允许访问的地址,默认是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"
进入/usr/local/src/redis-6.2.6目录
redis-server redis.conf
用ps -ef |grep redis查看是否启动
用kill停止redis进程
新建系统服务文件
vi /etc/systemd/system/redis.service
编辑文件
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重载系统服务
systemctl daemon-reload
# 设置开机启动
systemctl enable redis
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
命令行
# 连接
redis-cli -h 127.0.0.1 -p 6379
# 输入密码
auth 密码
# 检测是否连接
ping
# 退出
exit
图形界面
redis desktop manager, AnotherRedisDesktopManager等等
语言
key-value型
key一般是String类型
value可以是String, Hash, List, Set, SortedSet, GEO, BitMap, HyperLog类型
命令大全:https://redis.io/commands/
或者命令行输入
help @xxx类型
# 查看符合模板的所有key,不要在生产环境使用
keys key
# 删除key,返回删除的key数量
del key
# 判断key是否存在
exists key
# 给一个key设置有效期,到期时自动删除
expire key seconds
# 查看key剩余有效期
ttl key
value分为3类
string:普通字符串
int:整数类型
float:浮点类型
底层都是字节数组形式存储,最大空间不超过512m
# 添加或修改
set key value
# 获取
get key
# 批量添加
mset k1 v1 k2 v2
# 批量获取
mget k1 k2
# 自增1
incr key
# 自增指定步长
incrby key 步长
# 浮点自增
incrbyfloat key 步长
# 新增
setnx key value
# 新增指定有效期
setex key seconds value
允许多个单词形成层级结构,单词之间用:隔开
比如用户信息:k1=user:1, k2=user:2
value是无序字典,类似HashMap
# 添加或修改
hset key field value
# 获取
hget key field
# 批量添加
hmset key f1 v1 f2 v2
# 批量获取
hmget key f1 f2
# 获取key所有field,value
hgetall key
# 获取key所有field
hkeys key
# 获取key所有value
kvals key
# 自增指定步长
hincrby key field 步长
# 新增
hsetnx key field value
与LinkedList类似,可以正向反向检索
# 左侧插入
lpush key value
# 左侧删除并返回左侧第一个
lpop key
# 右侧插入
rpush key value
# 右侧删除并返回右侧第一个
# 返回一段范围的元素
lrange key start end
# 与lpop,rpop类似,没有元素会等待指定时间
blpop key timeout
brpop key timeout
与HashSet类似
# 添加
sadd key value
# 删除
srem key value
# 返回个数
scard key
# 判断是否存在
sismember key value
# 获取所有元素
smembers key
# 交集
sinter k1 k2
# 差集
sdiff k1 k2
# 并集
sunion k1 k2
与TreeSet类似,每个元素有个score属性,根据score排序
# 添加
zadd key score value
# 删除
zrem key value
# 获取score
zscore key value
# 获取排名
zrank key value
# 获取个数
zcard key
# 统计score在给定范围内的个数
zcount key min max
# 自增
zincrby key 步长 value
# 按照score排序获取指定排名范围的元素
zrange key min max
# 按照score排序获取指定score范围的元素
zrangebyscore key min max
# 差集
zdiff
# 交集
zinter
# 并集
zunion
# 默认升序,降序在z后面加rev,如zrevrange
jedis
以Redis命令作为方法名称,线程不安全,多线程环境需要基于连接池使用
lettuce
基于Netty实现,支持同步、异步和响应式编程,线程安全,支持哨兵、集群、管道模式
Redisson
基于Redis实现的分布式、可伸缩Java数据结构集合
引入依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>3.7.0version>
dependency>
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp() {
jedis = new Jedis("ip", 6379);
jedis.auth("password");
jedis.select(0);
}
@Test
void name() {
String result = jedis.set("name", "hhh");
System.out.println(result);
String name = jedis.get("name");
System.out.println(name);
}
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
}
Jedis连接池
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
// 最大连接
config.setMaxTotal(8);
// 最大空闲连接
config.setMaxIdle(8);
// 最小空闲连接
config.setMinIdle(0);
// 最长等待时间,单位ms
config.setMaxWaitMillis(1000);
jedisPool = new JedisPool(config, "ip", 6379, 1000, "password");
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
dependency>
spring:
redis:
host: ip
port: 6379
password: password
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 1000
@SpringBootTest(classes = RedisDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
void name() {
redisTemplate.opsForValue().set("name", "aaa");
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}
}
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// 设置value序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
StringRedisTemplate
key,value为string类型
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void test() {
stringRedisTemplate.opsForValue().set("name", "bbb");
Object name = stringRedisTemplate.opsForValue().get("name");
System.out.println(name);
}
其它Redis知识:JavaGuide Redis