Redis
1.介绍
1.1.NoSQl
non-relational -> no only SQL
:非关系型数据库
内存级别的数据库
1.2.分类
Redis:键值对
HBase:列存储
MongDb:文档类型存储
Neo4J:图形数据库
1.3.特点
仍旧是单线程
ACID处理比较简单
2.使用
2.1.安装
cmd
添加到环境变量
开启服务
客户端
一般公司都使用第一个数据库
3.指令
3.1.String类型
set key value
get key
incr key //没有的话自动创建变量并加一
decr key //没有的话自动创建变量并减一
del key
setnx key value //直接set的话会覆盖
setex key timeout value
ttl key
应用场景
- 点赞;正在观看的人数
- 共享Session
3.2.hash指令
hset 对象 字段 值
hget 对象 字段
hexists 对象 字段 //是否有这个键
hdel 对象 字段 //删除字段
hincrby 对象 字段 值
hlen 对象 //获取键数量
hkeys 对象 //获取所有键
hvals 对象 //获取所有值
hgetall 对象 //获取所有键值对
引用场景:
和String一样也是共享Session,前者是方便查询,后者是方便修改
3.3.list指令
类似队列或栈
lpush 对象 值
rpush 对象 值
rpop 对象
lpop 对象
lrange 对象 start end //显示范围数据 0 -1:可以列出所有数据,因为最后的数据是-1
llen 对象 //获取对象长度
可选
linsert key before/after refVal newVal -> 参考值之前/后插入数据
lset key index value -> 根据索引修改数据
lrem key count value -> 在列表中按照个数删除数据
ltrim key start end -> 范围截取列表
lindex key index -> 根据索引取列表中数据
引用场景:
list相同或者相似的多个数据
3.4.set指令
sadd key value -> 往set集合中添加元素
smembers key -> 列出set集合中的元素
srem key value -> 删除set集合中的元素
spop key count -> 随机弹出集合中的元素
sdiff key1 key2 -> 返回key1中特有元素(差集) //保留左边的
sinter key1 key2 -> 返回两个set集合交集
sunion key1 key2 -> 返回两个set集合的并集 //不知道这个并集有没有包括交集
scard key -> 返回set集合中元素个数
可选:
sdiffstore var key1 key2 -> 返回key1中特有元素存入另一个set集合
sinterstore var key1 key2 -> 返回两个set集合的交集存入另一个set集合
sunionstore var key1 key2 -> 返回两个set集合的并集存入另一个set集合
smove key1 key2 value -> 把key1中的某元素移入key2中
sismember key value -> 判断集合是否包含某个值
srandmember key count -> 随机获取set集合中元素
应用场景
抽奖、去重、社交共同
3.5.sorted_set类型
实时排序
zadd key score column -> 存入分数和名称
zincrby key score column -> 偏移名称对应的分数 //增加
zrange key start end -> 按照分数升序输出名称
zrevrange key start end -> 按照分数降序输出名称
zrank key name -> 升序返回排名 //从零开始算
zrevrank key name -> 降序返回排名
zcard key -> 返回元素个数
3.6.总结
排序使用zset
可重复使用list
不可重复使用set
多个键值对使用hash
键值对使用String
key值需要见名知意
4.其他
4.1.全局
keys *:列出所有指令
exists:是否存在
expires:设置过期时间,可以使用ttl查询过期时间
persist:取消过期时间
flushdb:清空数据库
4.2.密码
redis.windows-service.conf文件,执行命令后需要重启服务
下次登录redis-cli -a [密码]
# requirepass foobared
4.3.事务
multi开启,exec结束
redis的事务只是打包执行一堆脚本,不算mysql当中的事务
4.4.持久化
RDB:快照
save 900 1 //900秒内有一个发生改变则执行
save 60 10000
AOF:收集write函数追加到命令中
appendfsync always:一直
appendfsync everysec:折中
appendfsync no:根据系统
4.5.内存淘汰
默认报错
LRU:淘汰最远的
LFU:淘汰使用频率低的
TTL:找寻最快过期的
随机淘汰
4.6.过期key处理
惰性删除:访问才删除,会造成内存浪费
定时删除:方式不太友好
定期删除:某个时间段清理数据
5.java操作
5.1.jedis
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
指令
@Test
public void testJedisPool() {
// 1:创建Jedis连接池
JedisPool pool = new JedisPool("localhost", 6379);
// 2:从连接池中获取Jedis对象
Jedis jedis = pool.getResource();
// 3:TODO
//redis命令分别对应jedis的方法
jedis.set("namemm","wuyupeng");
// 4:关闭资源
jedis.close();
pool.destroy();
}
5.2.springboot
底层是lettuce
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
spring.redis.host=127.0.0.1
spring.redis.port=6379
#spring.redis.password=admin //密码可以不要
指令
//@Autowired
//private RedisTemplate xx;
//弄完配置后自动创建对象
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void test() {
//redisTemplate.opsForValue();//操作字符串
//redisTemplate.opsForHash();//操作hash
//redisTemplate.opsForList();//操作list
//redisTemplate.opsForSet();//操作set
//redisTemplate.opsForZSet();//操作有序set
//全局命令直接使用redisTemplate对象
redisTemplate.opsForValue().set("hello","xiaoming");
System.out.println(redisTemplate.opsForValue().get("hello"));
}