Redis基础
Redis是Key-Value型NoSQL数据库,将数据存储在内存中,同时也能持久化到磁盘,Redis常用于缓存,利用内存的高效提高程序的处理速度。
Redis的特点:
- 速度快
- 广泛的语言支持
- 持久化
- 多种数据结构
- 主从复制
- 分布式与高可用
Redis常用基本配置项:
./src/redis-server redis.conf
启动redis服务
./src/redis-cli shutdown
关闭redis服务
./src/redis-cli -p 端口号
启动redis客户端,-p指定端口(修改默认端口后连接redis需要加端口)
Redis数据库的名称是一个一个的数字,默认是0-15,一共16个数据库,可在redis.conf文件中修改databases
设置requirepass
后,启动客户端后需要输入auth 密码
登陆
Redis通用命令:
Redis常用数据类型:
- String 字符串类型
- Hash 键值对类型
- List 列表类型
- Set 集合类型
- Zset 有序集合类型
String 字符串类型
String最大512mb,建议单个不超过100kb
常用字符串命令:
Hash 键值对类型
Hash类型用于存储结构化数据
常用Hash命令:
List 列表类型
List列表就是一系列字符串的“数组”,按插入顺序排序;
List列表最大长度为2的32次方-1,可以包含40亿个元素
List命令:
lrange list 0 -1
输出列表中的元素
Set 集合类型
Set集合是字符串的无序集合,且集合成员唯一
sadd set1 b c d
往set1中添加元素
smembers set1
查看set1中的元素
sinter set1 set2
交集
sunion set1 set2
并集
sdiff set1 set2
差集,set1中有的,set2中没有的
Zset 集合类型
Zset集合是字符串的有序集合,且集合成员唯一
zadd zset1 99 c
往zset1中添加元素,并设置分数(元素按分数排序)
zrange zset1 0 -1
查看zset1中的元素
zrange zset1 0 -1 withscores
查看zset1中的元素和分数
Java中使用Redis
Jedis:
由Java语言开发的Redis客户端工具,对Redis命令进行了封装,方便上手
添加依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
连接到redis数据库
//端口为默认端口时,可以不写
Jedis jedis = new Jedis("192.168.77.129",6379);
//选择数据库2
jedis.select(2);
jedis操作字符串类型:
jedis.set("sn","7788-9900");
String sn = jedis.get("sn");
//可传入String数组或byte数组
jedis.mset(new String[]{"title","婴幼儿奶粉","num","20"});
List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
Long num = jedis.incr("num");
jedis操作Hash类型:
jedis.hset("student:332","name","小明");
String name = jedis.hget("student:332","name");
Map<String,String> hash = new HashMap<>();
hash.put("name","小李");
hash.put("age","18");
jedis.hmset("student:331",hash);
Map<String,String> smap = jedis.hgetAll("student:331");
jedis操作List类型:
jedis.del("letter");
jedis.rpush("letter",new String[]{"d","e","f"});
jedis.lpush("letter",new String[]{"c","b","a"});
List<String> letter = jedis.lrange("letter",0,-1);
jedis.lpop("letter");
jedis.rpop("letter");
letter = jedis.lrange("letter",0,-1);
利用Redis缓存数据:
public class CacheSample {
public static void main(String[] args) {
new CacheSample();
//将数据从Redis中提取出来
System.out.println("请输入要查询对商品编号:");
String goodsId = new Scanner(System.in).next();
Jedis jedis = new Jedis("192.168.77.129",6379);
try{
jedis.select(3);
String key = "goods:"+goodsId;
if(jedis.exists(key)){
String json = jedis.get(key);
Goods goods = JSON.parseObject(json,Goods.class);
}else{
System.out.println("不存在该商品编号");
}
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
public CacheSample(){
Jedis jedis = new Jedis("192.168.77.129",6379);
try{
//将数据存储到redis中
List<Goods> goodsList = new ArrayList<>();
goodsList.add(new Goods(8800,"苹果","",3.5f));
goodsList.add(new Goods(8801,"橙子","",5f));
goodsList.add(new Goods(8802,"香蕉","",2f));
jedis.select(3);
for(Goods goods:goodsList){
String json = JSON.toJSONString(goods);
String key = "goods:"+goods.getGoodsId();
jedis.set(key,json);
}
}catch (Exception e){
e.printStackTrace();
}finally {
jedis.close();
}
}
}
Redis持久化策略:
Redis持久化策略,将数据持久化到磁盘上,当启动Redis后可以从磁盘将数据加载到内存中,然后在内存中读取数据。
实现Redis持久化策略的方式:
1.RDB(数据快照模式),定期存储,保存的是数据本身,当服务器启动时,可以从RDB文件中恢复数据集。
2.AOF(追加模式),每次修改数据时,同步到硬盘(写操作日志),保存的是数据的变更记录。在服务器重启时,会把所有的写操作重新执行一遍,实现数据备份,当写操作集过大时,Redis会重写写操作集。
zrange和zrangebyscore:
jedis连接失败时:
- 解除保护模式:redis.conf文件中,设置
protected-mode no
- 关闭防火墙:
systemctl stop firewalld.service
Redis作为内存数据库,读取写入的速度非常快,经常用来存储数据、页面等缓存内容。
Mysql和Redis在处理大量读取数据操作时,一般需要配合使用,如获取大量帖子或新闻,就可以使用Redis将MySQL中的数据获取到,然后直接从Redis中读取数据,效率比较快。