本来对这个Redis没什么兴趣的,不就是一个缓存的数据库而已吗?直到上次配置spring-redis的时候,发现这个东西没有用户名。
spring:
redis:
host: 127.0.0.1
port: 6379
password:
配置如上所示,只有主机、端口和密码,和普通的MySQL或其他数据库不同。
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
我们熟知的就是Redis的缓存,Redis采用C编写,运行异常的快。是有磁盘存储支持的内存数据库!
适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。
使用场景:股票价格、数据分析、实时数据搜集、实时通讯。
Redis属于NoSQL,NoSQL = Not Only SQL。
如今数据量越来越大,传统的关系型数据库已经无法应付如此大数据的需求了。
举个例子:假设我们使用关系型数据库存储朋友圈,那一天会产生多少数据?再查询的时候数据库不就死了吗?
这让我想起了我之前关注的一个帖子:腾讯微信的后台数据库到底是怎么设计的?无知的人相谈甚欢,最后好像是官方的哥们是在看不下去了,回复:谁告诉你们微信用的是关系型数据库?
普通关系型数据库,如果只查询的话效率很高?如果算上读写的话?那可能传统的数据库都承受不住高并发。
重要的是关系型数据库没法扩展,大家想一想,因为数据之间是有关系的,所以数据库扩展绝对不像扩展后台服务规模一样再拎个服务器出来那么简单。
由此可见,在数据量日渐增长的今天,为了解决大数据量与高并发的难题,NoSQL应运而生。
NoSQL产品主要有四类:
类型 | 特点 | 代表 | 适用场景 |
---|---|---|---|
键值对存储 | 能实现快速查询,但存储的数据缺少结构化 | Redis | 内容缓存,主要用于处理大数据的高访问负载 |
列存储数据库 | 查找速度快,可扩展性强,更容易进行分布式扩展,但功能相对局限 | HBase | 分布式的文件系统 |
文档数据库 | 数据结构要求不严格,查询性能不高,而且缺乏统一的查询语法 | MongoDB | Web应用(相较于普通的Key-Value,其Value是结构化的) |
图形数据库 | 利用图结构相关算法,但需要对整个图做计算才能得出结果,不容易分布式 | Neo4j | 社交网络,推荐系统,专注于构建关系图谱 |
这些数据库的名称大家或多或少应该听说过吧?今天才真正知道它们的作用,各有其特长,我们需根据业务场景动态选择。Facebook的消息存储采用的就是HBase数据库,支持大数据进行随机、实时访问。
NoSQL因为数据之间都是没有关系的,所以易扩展,同时具有很高的读写性能,很适合高并发场景。
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG。
没过多久,创始人Salvatore Sanfilippo对MySQL的性能大失所望,于是他决定自己写一个数据库。牛人就是牛人,我们就算质疑MySQL的性能,想写也写不出来啊?!
2009年,Salvatore Sanfilippo完成了数据库的编写,这就是Redis。
Salvatore Sanfilippo将Redis开源,并一直进行着Redis的开发,直到今天。我们熟知的Github、StackOverflow、新浪微博等公司都是Redis的用户。
传统的缓存代码需要这样写,很冗长,都是重复的代码。
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
logger.info("判断Redis中是否有Key");
if (redisTemplate.hasKey(url)) {
logger.info("Redis命中,从Redis中获取");
return valueOperations.get(url);
}
logger.info("发起Get请求");
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
logger.info("存入缓存");
valueOperations.set(url, response.getBody(), TIME_OUT, TimeUnit.MINUTES);
感谢Spring AOP,我们可以使用注解实现缓存功能。
@Cacheable("cacheName")
public List<Student> findAll() {
return studentRepository.findAll();
}
使用注解实现缓存很简单,同时@Cacheable还有许多的高级用法,以后与大家详述。
Redis有三种动作:
GET:根据键查找值。
SET:给定键存储值。
DEL:删除键中的值。
然后就是Redis的数据结构,这个觉得暂时还不需要知道,毕竟现在使用的是现成的@Cacheable注解,还不需要我们手动去操作Redis。
一如代码深似海,软件之路很广很远。生命有限的我们不能把所有东西都精通,我们要在学习成本与能力提升之间进行权衡。
来自:https://segmentfault.com/a/1190000018930546
前段时间基础架构组、DBA还有云盘团队一起推广了phpredis的RedisCluster的线上使用,目前线上业务已经稳定,单业务的规模水平是:Qps平均15W,数据量在700G左右。现对这段时间的工作和所遇到的一些常见问题进行简单总结
redis常用数据结构strig、list、hash、set、zset,这是最常用的5中redis数据结构,其实还有些不太常用的数据结构比如:HyperLogLog、GeoHash、PubSub等
redis 是当前非常流行的缓存数据库,得益于其简单的 key-value 模式的数据存储和丰富的数据类型与事件机制使得 redis 成为当前后端开发中不可或缺的利器。下面推荐一些好用的 redis 的管理工具
前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重。后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正。
Redis在Php项目中的实际应用场景:商品维度计数、用户维度计数、存储社交关系、用作缓存代替memcached、反spam系统、用户Timeline/Feeds、最新列表&排行榜、消息通知、将Redis用作消息队列
php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。
Redis配置成主从模式,主库(Master)只负责写数据,从库(Slave)只负责读数据。一个主库可以拥有多个从库,但一个从库只能隶属于一个主库。
连接操作命令,持久化,远程服务控制,对value操作的命令,String,List,Set,Hash,Redis 发布订阅命令,Redis 事务命令,查看keys个数,清空数据库
目前有很多成熟的缓存产品,包括Redis,memcached等。这里以Redis为例来分析下使用缓存实现分布式锁的方案。主要的实现方式是使用Jedis.setNX方法来实现。以上实现方式同样存在几个问题:
说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单。但是用的人多了,就会出现很多不规范或者疏忽的地方,严重的时候甚至会导致生产事故
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!