redis什么类型数据库

redis什么类型数据库,第1张

1什么是Redis一款内存高速缓存数据库(全称远程数据服务);使用C语言编写Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sortedset)、hash等2Redis特点Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。-----Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中。(实现持久化)3Redis应用场景,它能做什么在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。(拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。)使用Redis有哪些好处?(1)速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和 *** 作的时间复杂度都是O(1)(2)支持丰富数据类型,支持string,list,set,sortedset,hash(3)支持事务, *** 作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4)丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除redis相比memcached有哪些优势?(1)memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型(2)redis的速度比memcached快很多(3)redis可以持久化其数据redis常见性能问题和解决方案:(1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4)尽量避免在压力很大的主库上增加从库(5)主从复制不要用图状结构,用单向链表结构更为稳定4redis和mysql的区别总结(1)类型上从类型上来说,mysql是关系型数据库,redis是缓存数据库(2)作用上mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢redis用于存储使用较为频繁的数据到缓存中,读取速度快(3)需求上mysql和redis因为需求的不同,一般都是配合使用。5redis和mysql要根据具体业务场景去选型redis和mysql要根据具体业务场景去选型mysql:数据放在磁盘redis:数据放在内存mysql支持sql查询,可以实现一些关联的查询以及统计;redis对内存要求比较高,在有限的条件下不能把所有数据都放在redis;mysql偏向于存数据,redis偏向于快速取数据,但redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据

查看redis数据库实例对应的配置文件

执行 ps -ef | grep redis-server ,确定redis的安装目录,一般配置文件都是 安装目录/etc/redisconf ;

redis提供了灵活的数据查询方式,最牛的就是key的搜索支持正则表达式。

jediskeys(“”);表示搜索所有key

jediskeys(“abc”)表示搜索开头为abc的key数据

遍历了key就能遍历到value。

其实就是一个set

复制代码代码如下:

RedisDO rd = new RedisDO();

rdopen();

Set s = rdjediskeys("");

Iterator it = siterator();

while (ithasNext()) {

String key = (String) itnext();

String value = rdjedisget(key);

Systemoutprintln(key + value);

}

rdclose();

rd的算法为集成redis 运算

复制代码代码如下:

package comjavaerclickway;

import redisclientsjedisJedis;

import redisclientsjedisJedisPool;

import redisclientsjedisJedisPoolConfig;

import redisclientsjedisexceptionsJedisConnectionException;

public class RedisDO {

public Jedis jedis;

public void close(){

jedisdisconnect();

jedis = null;

}

public Jedis open(){

JedisPoolConfig config = new JedisPoolConfig();

configsetMaxActive(100);

configsetMaxIdle(20);

configsetMaxWait(1000l);

JedisPool pool;

pool = new JedisPool(config, "xxxxxxxxxxxxxx", 6379);

boolean borrowOrOprSuccess = true;

try {

jedis = poolgetResource();

// do redis opt by instance

} catch (JedisConnectionException e) {

borrowOrOprSuccess = false;

if (jedis != null)

poolreturnBrokenResource(jedis);

} finally {

if (borrowOrOprSuccess)

poolreturnResource(jedis);

}

jedis = poolgetResource();

return jedis;

}

/

@param args

/

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

从业务服务器到Redis服务器这条调用链路中变慢的原因可能有2个

但是大多数情况下都是Redis服务的问题。但是应该如何衡量Redis变慢了呢?命令执行时间大于1s,大于2s?这其实并没有一个固定的标准。

例如在一个配置较高的服务器中,05毫秒就认为Redis变慢了,在一个配置较低的服务器中,3毫秒才认为Redis变慢了。所以我们要针对自己的机器做基准测试,看平常情况下Redis处理命令的时间是多长?

我们可以使用如下命令来监测和统计测试期间的最大延迟(以微秒为单位)

比如执行如下命令

参数中的60是测试执行的秒数,可以看到最大延迟为3725微秒(3毫秒左右),如果命令的执行远超3毫秒,此时Redis就有可能很慢了!

那么Redis有哪些慢 *** 作呢?

Redis的各种命令是在一个线程中依次执行的,如果一个命令在Redis中执行的时间过长,就会影响整体的性能,因为后面的请求要等到前面的请求被处理完才能被处理,这些耗时的 *** 作有如下几个部分

Redis可以通过日志记录那些耗时长的命令,使用如下配置即可

执行如下命令,就可以查询到最近记录的慢日志

之前的文章我们已经介绍了Redis的底层数据结构,它们的时间复杂度如下表所示

名称 时间复杂度 dict(字典) O(1) ziplist (压缩列表) O(n) zskiplist (跳表) O(logN) quicklist(快速列表) O(n) intset(整数集合) O(n)

「单元素 *** 作」 :对集合中的元素进行增删改查 *** 作和底层数据结构相关,如对字典进行增删改查时间复杂度为O(1),对跳表进行增删查时间复杂为O(logN)

「范围 *** 作」 :对集合进行遍历 *** 作,比如Hash类型的HGETALL,Set类型的SMEMBERS,List类型的LRANGE,ZSet类型的ZRANGE,时间复杂度为O(n),避免使用,用SCAN系列命令代替。(hash用hscan,set用sscan,zset用zscan)

「聚合 *** 作」 :这类 *** 作的时间复杂度通常大于O(n),比如SORT、SUNION、ZUNIONSTORE

「统计 *** 作」 :当想获取集合中的元素个数时,如LLEN或者SCARD,时间复杂度为O(1),因为它们的底层数据结构如quicklist,dict,intset保存了元素的个数

「边界 *** 作」 :list底层是用quicklist实现的,quicklist保存了链表的头尾节点,因此对链表的头尾节点进行 *** 作,时间复杂度为O(1),如LPOP、RPOP、LPUSH、RPUSH

「当想获取Redis中的key时,避免使用keys 」 ,Redis中保存的键值对是保存在一个字典中的(和Java中的HashMap类似,也是通过数组+链表的方式实现的),key的类型都是string,value的类型可以是string,set,list等

例如当我们执行如下命令后,redis的字典结构如下

我们可以用keys命令来查询Redis中特定的key,如下所示

keys命令的复杂度是O(n),它会遍历这个dict中的所有key,如果Redis中存的key非常多,所有读写Redis的指令都会被延迟等待,所以千万不用在生产环境用这个命令(如果你已经准备离职的话,祝你玩的开心)。

「既然不让你用keys,肯定有替代品,那就是scan」

scan是通过游标逐步遍历的,因此不会长时间阻塞Redis

「用用zscan遍历zset,hscan遍历hash,sscan遍历set的原理和scan命令类似,因为hash,set,zset的底层实现的数据结构中都有dict。」

「如果一个key对应的value非常大,那么这个key就被称为bigkey。写入bigkey在分配内存时需要消耗更长的时间。同样,删除bigkey释放内存也需要消耗更长的时间」

如果在慢日志中发现了SET/DEL这种复杂度不高的命令,此时你就应该排查一下是否是由于写入bigkey导致的。

「如何定位bigkey」

Redis提供了扫描bigkey的命令

可以看到命令的输入有如下3个部分

这个命令的原理就是redis在内部执行了scan命令,遍历实例中所有的key,然后正对key的类型,分别执行strlen,llen,hlen,scard,zcard命令,来获取string类型的长度,容器类型(list,hash,set,zset)的元素个数

使用这个命令需要注意如下两个问题

「如何解决bigkey带来的性能问题?」

我们可以给Redis中的key设置过期时间,那么当key过期了,它在什么时候会被删除呢?

「如果让我们写Redis过期策略,我们会想到如下三种方案」

定时删除策略对CPU不友好,当过期键比较多的时候,Redis线程用来删除过期键,会影响正常请求的响应

惰性删除读CPU是比较有好的,但是会浪费大量的内存。如果一个key设置过期时间放到内存中,但是没有被访问到,那么它会一直存在内存中

定期删除策略则对CPU和内存都比较友好

redis过期key的删除策略选择了如下两种

「惰性删除」 客户端在访问key的时候,对key的过期时间进行校验,如果过期了就立即删除

「定期删除」 Redis会将设置了过期时间的key放在一个独立的字典中,定时遍历这个字典来删除过期的key,遍历策略如下

「因为Redis中过期的key是由主线程删除的,为了不阻塞用户的请求,所以删除过期key的时候是少量多次」 。源码可以参考expirec中的activeExpireCycle方法

为了避免主线程一直在删除key,我们可以采用如下两种方案

Redis是一个内存数据库,当Redis使用的内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,交换会导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。

当实际使用的内存超过maxmemoey后,Redis提供了如下几种可选策略。

「Redis的淘汰策略也是在主线程中执行的。但内存超过Redis上限后,每次写入都需要淘汰一些key,导致请求时间变长」

可以通过如下几个方式进行改善

Redis的持久化机制有RDB快照和AOF日志,每次写命令之后后,Redis提供了如下三种刷盘机制

「当aof的刷盘机制为always,redis每处理一次写命令,都会把写命令刷到磁盘中才返回,整个过程是在Redis主线程中进行的,势必会拖慢redis的性能」

当aof的刷盘机制为everysec,redis写完内存后就返回,刷盘 *** 作是放到后台线程中去执行的,后台线程每隔1秒把内存中的数据刷到磁盘中

当aof的刷盘机制为no,宕机后可能会造成部分数据丢失,一般不采用。

「一般情况下,aof刷盘机制配置为everysec即可」

在持久化一节中,我们已经提到 「Redis生成rdb文件和aof日志重写,都是通过主线程fork子进程的方式,让子进程来执行的,主线程的内存越大,阻塞时间越长。」

可以通过如下方式优化

当机器的内存不够时, *** 作系统会将部分内存的数据置换到磁盘上,这块磁盘区域就是Swap分区,当应用程序再次访问这些数据的时候,就需要从磁盘上读取,导致性能严重下降

「当Redis性能急剧下降时就有可能是数据被换到Swap分区,我们该如何排查Redis数据是否被换到Swap分区呢?」

每一行Size表示Redis所用的一块内存大小,Size下面的Swap表示这块大小的内存,有多少已经被换到磁盘上了,如果这2个值相等,说明这块内存的数据都已经被换到磁盘上了

我们可以通过如下方式来解决

最后我们总结一下Redis的慢 *** 作

以上就是关于redis什么类型数据库全部的内容,包括:redis什么类型数据库、查看redis数据库实例对应的配置文件。、jedis查看redis数据库多少条数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9710943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存