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端⼝
. ⾸先,客户端socket会被设置为⾮阻塞模式
. 然后为socket设置tcp_nodelay属性
. 设置⼀个⽂件来监听
11. 事务
//事务开始
mutil
//⼊队
set person yiyi
set person erer
//执⾏
exec
//回滚,取消
discard
//监听
watch
jedis
1. jedis是java来访问redis数据库的api。
2. 新建项⽬:
添加依赖:junit,jedis2.8.0
打开redis服务器
3. TestJedis.java
@Bdfore
public void setUp() {
j = new Jedis();
}
@After
public void tearDown() {
if(j!=null){
j.close();
}
}
@Test
public void testConnection() {
String ping = j.ping();
Syso(ping);
Syso(j.set("java","hello"));
Map<> map = new HashMap<>();
map.put("name","sansan");
map.put("sid","001");
Syso(j.hmset("sansan",set));
Syso(j.hgetAll("sansan"));
Syso(j.hget("sansan","sid"));
}
@Test
public void testPool () {
GenericObjectPoolConfig config = new JedisPool;
//设置连接最⼤空闲数
config.setrMaxIdle(19);
//设置连接总数
config.setMaxTotal(50);
List<JdeidsSharedInfo> shared = new ArrayList<>();
shard.add(new JedisShared());
SharedJdeisPool pool = new SharedJedisPool(config,shard);
SharedJedisPool jedis = pool.getResource();
jedis.zrangeByScore("stus",0,100);
}
补充
- ⼆⼋定律:
- 概念:⽹站访问数据的特点⼤多数呈现在"⼆⼋定律":80%的业务访问集中在20%的数据上。
这时为了减轻数据的压⼒和提⾼⽹站的数据访问速度,则可以使⽤缓存机制来优化⽹站。 - 热数据
- 访问频次:需要被频繁访问的数据
- 数据库:计算
- 冷数据:
- 访问频次:对于离线类不经常访问的数据,⽐如,企业备份数据,⽇志数据。
- 数据库:存储
- redis为什么这么快?
- 完全基于内存
- 数据结构简单
- 单线程单进程,避免上下⽂切换,不必考虑锁。
- 单个线程⾼效的处理多个连接请求(尽量减少⽹络 IO 的时间消耗)
- 为什么redis 单线程?
- 因为单线程已经很快了,不再需要多线程
- 但redis运⾏的时候不⽌⼀个线程的,⽐如持久化的时候会fork⼀个⼦进程。