学习笔记--Redis
Redis
NoSQL概述
什么是NoSQL
- NoSQL = Not Only SQL
- 非关系型的数据库
为什么需要NoSQL
- High performance 高并发读写
- Huge Storage 海量数据的高效率存储和访问
- High Scalability && High Availability 高可扩展性和高可用性
NoSQL数据库的四大分类
- 键值存储
- 列存储
- 文档存储
- 图形存储
NoSQL特点
- 易扩展
- 灵活的数据模型
- 大数据量,高性能
- 高可用
Redis概述
高性能键值对数据库,支持的键值数据类型
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
Redis应用场景
- 缓存
- 任务队列
- 应用排行榜
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
Redis安装
linux下安装redis
- 安装gcc-c++
- make
- make PREFIX=/home/programs/redis install
- 复制redis.conf
- 修改redis.conf
- 启动./bin/redis-server ./redis.conf
- 关闭 ./bin/redis-cli shutdown
Jedis
简单示例
依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
示例
/**
* Jedis的测试
* Created by qy_lu on 2018/1/7.
*/
public class JedisTest1 {
private static final String HOST = "192.168.31.100";
private static final int PORT = 6379;
/**
* 单实例的测试
*/
@Test
public void test1() {
// 1.设置IP地址和端口
Jedis jedis = new Jedis(HOST, PORT);
// 2.保存数据
jedis.set("name", "imooc");
// 3.获取数据
String value = jedis.get("name");
System.out.println(value);
// 4.释放资源
jedis.close();
}
@Test
/**
* 使用连接池
*/
public void test2() {
// 获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 设置最大连接数
config.setMaxTotal(30);
// 设置最大空闲连接数
config.setMaxIdle(10);
// 获得连接池
JedisPool jedisPool = new JedisPool(config, HOST, PORT);
// 获得核心对象
Jedis jedis = null;
try {
// 通过连接池获得连接
jedis = jedisPool.getResource();
// 设置数据
jedis.set("name", "zhangsan");
// 获取数据
String value = jedis.get("name");
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (jedis != null) {
jedis.close();
}
if (jedisPool != null) {
jedisPool.close();
}
}
}
}
Redis的数据结构
key
- 不要太长
- 不要太短
- 统一的命名规范
存储String
赋值
set company imooc
get company
getset company baidu //取company的值并将company的值设为baidu
del company
incr person //将person递增1,空为0再递增
decr person //将person递减1
incrby num 5 //将num加5
decrby num 5 //将num减5
append num 5 //在num末尾追加字符5
存储Hash
hset myhash username jack
hset myhash age 18
hmset myhash2 username rose age 21
hget myhash username
hmget myhash username age
hgetall myhash
hdel myhash username
del myhash
hincrby myhash age 5 //myhash中的age的值增加5
hexists myhash username //myhash中是否存在username
hlen myhash //获取myhash中key的数量
hkeys myhash //获取myhash中所有的key
hvals myhash //获取myhash中所有的val
存储list
lpush mylist a b c //从左边压入元素
rpush mylist2 a b c //从右边压入元素
lrange mylist 0 5 //列出索引位置在0(start)和5(end)之间的元素
lrange mylist 0 -1 //也可以用-1表示从末端算起第几位
lpop mylist //从左边弹出一个元素
rpop mylist //从右边弹出一个元素
llen mylist //获取列表的元素数量
lpushx mylist x //将元素插入到列表的头部,若mylist不存在则不插入
lrem mylist 2 3 //从前往后删除2个3
lrem mylist -2 3 //从后往前删除2个3
lrem mylist 0 3 //删除列表里所有的3
lset mylist 3 x //将索引为3的位置的值设置为x
linsert mylist before b 11 //在第一个b之前插入11
linsert mylist after b 22 //在第一个b之后插入22
rpoplpush mylist1 mylist2 //将mylist1的最右边元素弹出并压入mylist2的最左边
存储set
sadd myset a b c //增加
srem myset a b //删除
smembers myset //查看所有
sismember myset a //a是否存在myset中
sdiff mya1 myb1 //mya1和myb1的差集,mya1中有的,myb1中没有的元素
sinter mya1 myb1 //求交集
sunion mya1 myb1 //求并集
scard myset //集合中元素数量
srandmember myset //随机返回一个元素
sdiffstore my1 mya1 myb1 //将mya1和myb1的差集存到my1
sinterstore my1 mya1 myb1 //将mya1和myb1的交集存到my1
sunionstore my1 mya1 myb1 //将mya1和myb1的并集存到my1
存储Sorted-set
zadd mysort 70 zs 80 ls 90 ww //增加给定评分的值
zadd mysort 100 zs //新的评分会覆盖旧的
zscore mysort zs //获得zs的分数
zrem mysort ls ww //删除元素
zcard mysort //元素数量
zrange mysort 0 -1 //列出元素
zrange mysort 0 -1 withscores //列出元素并带分数
zrevrange mysort 0 -1 withscores //按分数从大到小列出元素
zremrangebyrank mysort 0 4 //删除范围内的元素
zremrangebyscore mysort 80 100 //按分数范围删除元素
zrangebyscore mysort 0 100 //列出分数范围内的元素
zrangebyscore mysort 0 100 withscores //列出分数范围内的元素并带分数
zrangebyscore mysort 0 100 withscores limit 0 2 //列出分数范围内的前n个元素并带分数
zincrby mysort 3 ls //给ls的分数增加3
zcount mysort 80 100 //分数范围内的元素数量
keys通用操作
keys *
keys my?
del my1 my2 my3
exists my1
exists mya1
rename key1 key2
expire key1 1000 //设置过期时间
ttl key1 //剩余时间
type key1 //key1的类型
Redis特性
多数据库
0 - 15数据库实例
select 0 //使用0号数据库
select 1
move myset 1 //将myset移动到1号数据库
事务
multi //开启事务
exec //命令被原子化执行
discard //回滚
Redis持久化
- RDB持久化
- AOF持久化
- 无持久化
- 同时使用RDB和AOF持久化
RDB持久化
默认使用RDB
将内存快照定时写到硬盘
只有一个文件
redis.conf配置
AOF持久化
记录操作日志
redis.conf配置
Spring Data Redis
Maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qyluo.redis</groupId>
<artifactId>redis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>redis-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>