# redis
1. 概念:基于内存,缓存数据库,⾮关系型数据库。
2. 特点:
1. 内存作为数据存储介质。1.珍贵,2.读写效率极⾼,远超数据库。需要异步的同步到磁盘
上,所以,持久化⽅式有两种。
2. ⾮关系型数据库,所以KeyValue形式存储,数据类型value有多种,常⻅的有5种。
3. 与 memcache 不同的是,但有持久化操作,可以作为数据库使⽤。持久化⽅式两种:快照
模式,aof⽇志追加模式。
4. 主从模式,主服务器和备服务器,哨兵模式。
5. 缓存过程:第⼀次取,将数据从数据库读取,都放在内存中的redis中,缓存,第⼆次,直
接从内存的redis去取,节约了应⽤程序服务器和数据库通过io交互的次数。
3. 配置⽂件:redis.windows.conf
4. 可视化⼯具:redis desktop manager
5. test01,执⾏ redis 的⽅法
//1. 启动redis服务端
redis-server redis.windows.conf
//2. 启动redis客户端
//重启⼀个cmd,之前的不能关,是服务器
redis-cli.exe -p 6379
redis-cli.exe -h localhost -p 6379
//3. 服务器和客户端是否接上头
ping
//4. 设置密码
//服务器不重启⼀直这个密码
config set requirepass abc
6. test02,数据类型
//选择数据库,默认0-15有16个数据库
select 2
//1. 设置获取 string
set hello world
get hello
//2. 存储 hash 类型,适合存储对象。
hmset stu sid 02142010 score 99
hgetall stu
hget stu sid
//3. lists:(1)重复有序,返回下标索引。(2)redis的list基于链表,查询慢,插⼊删除快。
//左侧插⼊
lpush subject java
lpush subject html5
lpush subject python
lrange subject 1 100
//右侧插⼊
rpush bike hello
rpush bike ofo
rpush bike mobike
lrange bike 0 100
rpush bike hello
//4. set ⽆序集合,不重复,返回受影响⾏数。
sadd week monday
sadd week thuresday
sadd week Wednesday
sadd week thrusday
smembers week
//5. zset 有序集合,不重复。
zadd java 100 yiyi
zadd java 100 erer
zadd java 99 sansan
zrangebyscore java 0 99
zrangebyscore java 100 100
7. redis的持久化
8. 安全:
//设置密码,默认没有密码
set requirepass abc
auth abc
9. 性能测试
10. 客户端连接
redis通过监听⼀个tcp端⼝
1. ⾸先,客户端socket会被设置为⾮阻塞模式
2. 然后为socket设置tcp_nodelay属性
3. 设置⼀个⽂件来监听
11. 事务
//事务开始
mutil
//⼊队
set person yiyi
set person erer
//执⾏
exec
//回滚,取消
discard
//监听
watch
jedis
1. jedis是java来访问redis数据库的api。
2. 新建项⽬:
1. 添加依赖:junit,jedis2.8.0
2. 打开redis服务器
package com.qfedu.test;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestJedis {
Jedis j=new Jedis();
@Before
public void setUp(){
j=new Jedis();
}
@After
public void tearDown(){
if (j!=null){
j.close();
j=null;
}
}
@Test
public void test(){
System.out.println(j.ping());
}
@Test
public void testString(){
System.out.println(j.set("aaa", "rr"));
System.out.println(j.get("aaa"));
}
@Test
public void testHash(){
Map actors=new HashMap<>();
actors.put("jack","jack");
actors.put("rose","rose");
System.out.println(j.hmset("actor", actors));
System.out.println(j.hgetAll("actor"));
}
@Test
public void testList(){
System.out.println(j.rpush("person", "xiaowang"));
System.out.println(j.rpush("person", "xiaoma", "xiaoliu", "xiaozhao"));
System.out.println(j.lrange("person", 0, 10));
}
//不重复
@Test
public void testSet(){
System.out.println(j.sadd("food", "zhaji","baozi","zhaji"));
System.out.println(j.smembers("food"));
}
@Test
public void testZset(){
System.out.println(j.zadd("fenshu", 200, "java"));
System.out.println(j.zadd("fenshu", 100, "html"));
System.out.println(j.zadd("fenshu", 90, "phyton"));
System.out.println(j.zrangeByScore("fenshu", 80, 150));
}
//连接池
@Test
public void testPool(){
GenericObjectPoolConfig config=new GenericObjectPoolConfig();
//设置最大的空闲数
config.setMaxIdle(20);
//设置最大连接总数
config.setMaxTotal(50);
//设置最大的等待时间
config.setMaxWaitMillis(5000);
List shard=new ArrayList<>();
//连接redis服务器 连接本机的6379
shard.add(new JedisShardInfo("localhost","6379"));
ShardedJedisPool pool=new ShardedJedisPool(config,shard);
ShardedJedis jedis = pool.getResource();
System.out.println(jedis.get("aaa"));
}
}
//Jredis是java连接redis 的一套api
补充
1. ⼆⼋定律:
1. 概念:⽹站访问数据的特点⼤多数呈现在"⼆⼋定律":80%的业务访问集中在20%的数据上。
这时为了减轻数据的压⼒和提⾼⽹站的数据访问速度,则可以使⽤缓存机制来优化⽹站。
2. 热数据
1. 访问频次:需要被频繁访问的数据
2. 数据库:计算
3. 冷数据:
1. 访问频次:对于离线类不经常访问的数据,⽐如,企业备份数据,⽇志数据。
2. 数据库:存储
4. redis为什么这么快?
1. 完全基于内存
2. 数据结构简单
3. 单线程单进程,避免上下⽂切换,不必考虑锁。
4. 单个线程⾼效的处理多个连接请求(尽量减少⽹络 IO 的时间消耗)
5. 为什么redis 单线程?
1. 因为单线程已经很快了,不再需要多线程
2. 但redis运⾏的时候不⽌⼀个线程的,⽐如持久化的时候会fork⼀个⼦进程。