Redis_初识
一、简介
Redis(Remote Dictionary Server)本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作吧数据库flush到硬盘上进行保存。
二、Redis 使用场景
- 会话缓存
最常使用的一种Redis场景,用redis缓存会话比其他存储(Memcached)的优势在于:Redis提供持久化。
- 全页缓存(FPC)
除基本的会话token外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大的改进,类似PHP本地FPC。
- 队列
Redis 在内存存储引擎领域的一大优点就是提供list和Set操作,这使得Redis能作为一个很好的消息队列平台来使用。
- 排行榜、计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
- 发布、订阅
最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!
三、Redis 相关问题
1. Redis支持哪几种数据类型
- String、List、Set、Sorted Set、hashes
2. Redis主要消耗的资源
- 内存
3. redis 有哪几种淘汰策略
将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据库。
驱逐策略
- no_eviction:不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息。
- allkeys-lru:所有Key通用;优先删除最近最少使用的key。
- volatile-lru:只限制于设置了expire的部分;优先删除最近最少使用的key.
- allkeys-random:所有key通用;随机删除一部分 key。
- volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。
驱逐的内部实现
1. 驱逐的过程
- 客户端执行一个命令,导致Redis中的数据增加,占用更多的内存。
- redis检查内存使用量,如果超出maxmemory限制,根据策略清除部分 key。
- 继续执行下一条命令,以此内推。
- 在这个过程中,内存使用量会不断地达到limit值,然后超过,然后删除部分key,使用量又下降到limit值之下。
- 如果某个命令导致大量内存占用(比如通过新key保存一个很大的set),在一段时间内,可能内存的使用量会明显超过 maxmemory 限制。
2. LRU算法
Redis使用的并不是完全LRU算法。自动驱逐的Key,并不一定是最满足LRU特征的那个,而是通过近似LRU算法,抽取少量的Key样本,然后删除其中访问时间最古老的那个key。
驱逐算法,从Redis 3.0 开始得到了巨大的优化,使用Pool(池子)来作为候选,这大大提升了算法效率,也更接近于真实的LRU算法。
在Redis的LRU算法中,可以通过设置样本(Sample)的数量来调优算法精度。通过以下指令配置:
maxmemory-samples 5
4. 字符串类型的值能存储最大容量是多少?
512M
5. 为什么Redis需要吧所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
- 所以redis具有快速和数据持久化的特征。如果不将数据放到内存中,磁盘I/O速度为严重影响Redis的性能。
- 在内存越来越便宜的今天,redis将会越来越受欢迎。
6. Redis集群方案应该怎么做?都有哪些方案?
- codis
目前用的最多的集群方案,基本和twemproxy一致 的效果,蛋挞支持在节点数量改变情况下,就节点数据可恢复到新Hash节点。
2.redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。
7. Redis集群方案什么情况下会导致整个集群不可用?
有A、B、C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会缺少5501-11000这个范围的槽而不可用。
8. MySQL里有2000W数据,Redis中只存20W的数据,如何保证Redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
9. Jedis与Redisson对比有什么优缺点?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
10.Redis如何设置密码及验证密码?
设置密码:config set requirepass 123456
授权密码:auth 123456
11.Redis哈希槽的概念?
Redis集群没有使用一致性Hash,而是引入Hash槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
附:java使用Redis demo
获取Redis连接
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author Winstone
* @date 2019/12/20 - 1:26 下午
*/
public class RedisUtil {
//服务器IP地址
private static String ADDR = "127.0.0.1";
//端口
private static int PORT = 6379;
//密码
private static String AUTH;
//连接实例的最大连接数
private static int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
private static int MAX_WAIT = 10000;
//连接超时的时间
private static int TIMEOUT = 10000;
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
//数据库模式是16个数据库 0~15
public static final int DEFAULT_DATABASE = 0;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT,AUTH,DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
System.out.println("redis--服务正在运行: "+resource.ping());
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
*
* 释放资源
*/
public static void returnResource(final Jedis jedis) {
if(jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
Redis操作
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author Winstone
* @date 2019/12/20 - 12:15 上午
*/
public class RedisOptions {
private final static Jedis conn = RedisConnection.getRedisConnection();
// 字符串操作
public boolean set(String key, String value) {
try {
conn.set(key, value);
return true;
} catch (Exception e) {
return false;
}
}
public String get(String key) {
try {
return conn.get(key);
} catch (Exception e) {
return null;
}
}
//队列操作
public boolean setList(String name, String[] list) {
if (list.length != 0) {
for (String str : list) {
conn.lpush(name, str);
}
return true;
} else {
return false;
}
}
public boolean setList(String name, List<String> list) {
if (list.size() != 0) {
for (String str : list) {
conn.lpush(name, str);
}
return true;
} else {
return false;
}
}
public List<String> getList(String name){
long length = conn.llen(name);
List<String> list = new ArrayList<String>();
if (length>0){
list = conn.lrange(name,0,length-1);
}
return list;
}
//集合操作
public boolean setSet(String name, Set<String> set){
if (!set.isEmpty()){
for (String str:set){
conn.sadd(name,str);
}
return true;
}
return false;
}
}
Redis_初识的更多相关文章
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
随机推荐
- java中map和对象互转工具类的实现示例
在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map ...
- win10 system guard运行时监视器,关闭服务
这个服务,内存占用了高达21%,造成工作电脑运行缓慢,经常卡死1min,要关闭服务,并不能直接在任务管理器“服务”这里对属性进行修改,会提示“拒绝访问”,即使修改了文件夹属性也不可以,要修改注册表方可 ...
- png8和png24的根本区别
1.png8和png24的根本区别,不是颜色位的区别,而是存储方式不同. 2.png8有1位的布尔透明通道(要么完全透明,要么完全不透明),png24则有8位(256阶)的布尔透明通道(所谓半透明). ...
- ThinkPHP3(命名空间、RBAC)
命名空间 当开发大型项目的时候,可以会需要成千上万的文件 面向对象通过命名空间来解决这个问题的. PHP命名空间是PHP5.3以后才出现的. 命名空间中可以出现:类,函数,常量 只有const定义的常 ...
- MySQL ALTER TABLE语法
先看一下定义(密密麻麻) ALTER TABLE tbl_name [alter_specification [, alter_specification] ...] [partition_optio ...
- [转帖]SSD和内存数据库技术
SSD和内存数据库技术 自己的理解还是不是很对 SSD 提升的是 随机读 并没有对顺序写有多大的提升, 因为数据库采用的是redo的模式. 理论上写入 时是顺序写 所以 写并发的提升不会很大 但是会很 ...
- [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录
在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...
- redis单机多节点集群
# ##安装Redis redis安装参考 https://www.cnblogs.com/renxixao/p/11442770.html Reids安装包里有个集群工具,要复制到/usr/loca ...
- Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数
Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...
- golang 堆排序
堆排序的思想 因为堆的形式是完全二叉树,跟数组的索引形成映射,可以使用数组保存.先构建最大(小)堆,根结点就是最大(小)值,删除根结点之后的节点重新构建堆,依此顺序,即可完成堆排序. 代码实现 pa ...