Redis 简介
redis 时一款高性能的非关系型数据库(NOSQL),包含多种数据结构、支持网络、可选持久性的键值对存储数据库。
- 数据的存储格式是key,value形式,且数据之间没有关联关系
- 数据存储在内存中,性能高效
- 支持分布式,理论上可以无限扩展
- 单线程请求处理、I/O多路复用技术
关系型数据库和 NoSQL 数据库是互补的关系。一般将数据存储在关系型数据库中,在 nosql 数据库中备份存储关系型数据库的数据。
Redis 命令操作
Redis 数据结构
redis 存储的是 key,value 形式的数据,key 都是字符串,value 有5中不同的数据结构。
字符串类型:string;可以存储字符串、图片等多种类型,最大长度支持 512 M。
- GET key/MGET key1 [key2 …]:获取单个/多个字符元素
- SET/MSET/SETEX/MSETNX:存储单个/多个值/设置指定过期时间的键值对
- DEL key1 [key2 …]:删除指定 key
- INCR/DECR
- GETSET
哈希类型:hash;map 格式,key 和 value 都是字符串类型
- HGET/HMGET/HGETALL:获取一个/多个/所有字段的值
- HSET/HMSET/HSETNX:赋值一个/多个字段/键不存在时设置值
- HDEL:删除字段
- HKEYS/HVALS:获取所有字段名/字段值
- HEXISTS/HLEN
列表类型:list;底层基于 linkedList 实现,是一个插入顺序排序的字符串元素集合。
- LPUSH/LPUSHX/RPUSH/RPUSHX/LINSERT/LSET
- LPOP/RPOP:删除列表中最左/右边的数据,并将元素返回
- LINDEX/RINDEX/LRANGE/RANGE:获取列表在:给定位置的单个元素/给定范围内的所有值
- LLEN/LTRIM
集合类型:Set;集合中的元素没有顺序, 且元素是唯一的。Set 类型的底层是通过哈希表实现的。
- SADD:向集合中添加元素
- SMEMBERS:获取 set 集合中所有的键
- SREM/SPOP/SMOVE:删除 set 集合中给定的键
- SCARD:获取 set 集合长度
- SISMEMBER:潘顿键是否在集合中
- SINTER/SDIFF/SDIFFSTORE/SUNION
有序集合类型:sorted set;每个元素都会关联一个 double 类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与 Set 类型一样,其底层也是通过哈希表实现的。
- ZADD
- ZRANGE:获取指定范围内的所有值
- ZREM/ZPOP/ZMOVE
- ZCARD/ZCOUNT
- ZINTER/ZDIFF/ZDIFFSTORE/ZUNION
通用命令
keys *
:查询所有的键
type key
:获取键对应的 value 的类型
del key
: 删除指定的 key:value
exists key [key ...]
:判断是否存在指定的 key
expire kery second
:设置 key 的过期时间
Redis 持久化
将 redis 内存中的数据持久化保存到磁盘中。
RDB(默认方式)
默认使用的机制:快照持久化,在一定的时间间隔中,检查 key 的变化情况,然后持久化数据。
Step1:在文件 redis.windows.conf 中配置保存时间
Step2:重启 redis 服务器,并指定配置文件名称
- redis-server.exe redis.windows.conf
AOF (Append only file)
日志记录的方式,可以记录每一条命令的操作。在每一次操作后都进行数据持久化。
Step1:编辑 redis.windows.conf 文件:appendonly no
关闭 aof;appendonly yes
开启 aof。
Step2:设置持久化的方式
appendfsync no
:不进行持久化appendfsync always
:每一次操作都进行持久化appendfsync everysec
:每隔一秒进行一次持久化
JAVA 操作 Redis
下载 jar 包
将准备好的 jar 包添加到项目中。
- commons-pool2-x.x.jar
- jedis-x.x.x.jar
程序使用
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisTest {
// 直接获取并使用
@Test
public void test1() {
// 获取核心对象:jedis(host,port)
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("name", "test");
String value = jedis.get("name");
System.out.println(value);
jedis.close();
}
// 通过连接池获取并使用
@Test
public void test2() {
// 获取连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 设置最大连接数
config.setMaxTotal(30);
// 设置最大的空闲连接
config.setMaxIdle(10);
// 获取连接池
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379);
// 获取核心对象:jedis
Jedis jedis = jedisPool.getResource();
jedis.set("jedis", "testJedis");
String value = jedis.get("jedis");
System.out.println(value);
jedis.close();
jedisPool.close();
}
}