redisWebStageDay18

NOSQL数据库-Redis

1.NOSQL引入:

1)NOSQL = Not Only SQL , 只要能存储数据,例如word等文档,都可泛指为非关系型数据库.
2)传统关系型数据库的瓶颈问题:
	(1)High performance - 对数据库高并发读写的需求 ;
	(2)Huge Storage - 对海量数据的高效率存储和访问的需求 ;
	(3)High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求 .
3)NOSQL的特点:(去掉关系数据库的关系型特性)
	(1)易扩展
	(2)大数据量下,读写性能高
	(3)灵活的数据模型,随时可存储自定义的数据格式(增删字段)
	(4)高可用的架构(?)

2.Redis概述:

1)概念:
Redis(数据库):是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

2)Redis支持存储的value类型:
包括string(字符串)、list(双向链表,字符串列表)、set(集合,无序不重复的字符串集合)、zset(sorted set,有序不重复的字符串集合)
和hash(键、值都为字符串的哈希表)。这些数据类型都支持push/pop、add/remove及取交集,并集和差集及更丰富的操作

3)工作机制:为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,
 并且在此基础上实现了master-slave(主从)同步。

 主从同步:-->数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
 这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,
 使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

4)redis的应用场景:
缓存(数据查询、短连接、新闻内容、商品内容等等)
聊天室的在线好友列表
任务队列(秒杀、抢购、12306等等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
分布式集群架构中的session分离

3.window版Redis的安装与使用

1)github下载地址:https://github.com/MSOpenTech/redis/tags ,解压后免安装.
2)window版Redis的目录结构:
	- redis-benchmark		性能测试工具
	- redis-check-aof		AOF文件修复工具		
	- redis-check-dump		RDB文件检查工具(快照持久化文件)
	- redis-cli				命令行客户端
	- redis-server			redis服务器启动命令	
	- redis.windows.conf	redis核心配置文件

4.持久化的两种配置策略:

1) redis.windows.conf文件	(不安全)
	save<seconds><changes>
	save 900 1
	save 300 10
	save 60 10000	
数据保存在dump.rdb文件中(二进制保存)
2) appendonly.aof文件
	原理类似于 MySQL 导出备份,备份了sql执行语句 
	三种配置方式:
		appendfsync always
		appendfsync everysec
		appendfsync no

5.Jedis:
jedis就是集成了redis的一些命令操作,封装了redis的java客户端, 提供了连接池管理.

JedisUtil 工具类配置(类似c3p0-config.xml配置文件和DataSourceUtil工具类):
需求: 1)编写Jedis数据库的配置文件和连接池工具类;
      2)配置文件使用properties格式;
      3)要求数据库启动时,只创建一次连接池,每次使用该数据库,都从连接池中获取Jedis连接对象,使用完毕归还给连接池;
步骤:
	1) 导入jar包: jedis-2.7.0.jar 和 commons-pool2-2.3.jar
	2) 编写配置文件 redis.properties
	3) 编写JedisUtil工具类:
		(1)解析配置文件, 设置连接池配置, 创建连接池的工作,放置在静态代码块中(在项目启动后最先执行,且只执行一次)
		(2)创建连接池配置对象,并使用ResourceBundle工具类 解析properties	配置文件
		(3)调用连接池配置对象的set方法,设置连接池配置参数, 获取连接池对象.
		(4)创建获取连接的静态方法getJedis()方法,从连接池中获取Jedis(类似以前的Connection对象).
	4) 写main方法,测试一下(工具类编写成功后,main方法可删除)

常用命令:

Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE
当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。

TYPE key — 用来获取某key的类型
KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,KEYS ?(一个?匹配一个字符)
RANDOMKEY - 返回随机的一个key
RENAME oldkeynewkey— key也可以改名

列表操作:
RPUSH key string — 将某个值加入到一个key列表末尾(rightPush)
LPUSH key string — 将某个值加入到一个key列表头部(leftPush)
LLEN key — 列表长度(length)
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样(range)
LTRIM key start end — 只保留列表中某个范围的值(trim)
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度(index)
LSET key index value — 设置列表中某个位置的值

LPOP key
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了(rightPop&leftPop)

集合操作:
SADD key member — 增加元素(add)
SREM key member — 删除元素(remove)
SCARD key — 返回集合大小(card)
SISMEMBER key member — 判断某个值是否在集合中(is member)
SINTER key1 key2 … keyN — 获取多个集合的交集元素(intermingle)
SMEMBERS key — 列出集合的所有元素(members)
还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0。


redis---->Map<String,Object>

  • 字符串类型 string
    <String,String>
  • 散列类型 hash
    <String,hashMap<String,string>>
  • 列表类型 list
    <String,linkedList>
  • 集合类型 set
    <String,set>
  • 有序集合类型 sortedset
    <String,sortSeted>

1.为什么使用redis?–>redis内部机制(redis是单线程工作模型)
在项目中使用redis,主要是从两个角度去考虑:性能和并发。

1)性能:在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。

这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

2)并发:在高并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。

这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

2.redis的数据类型,以及每种数据类型的使用场景?

1)string(字符串)
最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
2)hash(键、值都为字符串的哈希表)
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。
应用场景:做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,
设置30分钟为缓存过期时间,能很好的模拟出类似session的效果
3)list(双向链表,字符串列表)
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,
做基于redis的分页功能,性能和用户体验好。
4)set(集合,无序不重复的字符串集合)
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。另外,就是利用交集、并集、差集等操作,
可以计算共同喜好,全部的喜好,自己独有的喜好等功能。
思考:为什么不用JVM自带的Set进行去重?
因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了做一个全局去重,再起一个公共服务,太麻烦了。
5)zset(sorted set,有序不重复的字符串集合)
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。

3.使用redis有哪些好处?

1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2) 支持丰富数据类型,支持string,list,set,sorted set,hash
3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

4.redis的过期策略以及内存淘汰机制?(补充)

redis采用的是定期删除+惰性删除策略。
1)为什么不用定时删除策略?
定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。
在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.
2)定期删除+惰性删除是如何工作的呢?
定期删除,redis默认每隔100ms检查,是否有过期的key,有过期key则删除。需要说明的是,
redis不是每隔100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。
因此,如果只采用定期删除策略,会导致很多key到时间没有删除。于是,惰性删除派上用场。
也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
3)采用定期删除+惰性删除就没其他问题了么?
不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。
这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

今日重点:
1.Redis的数据类型—String类型
2.RedisUtil工具类编辑(配置文件和工具类)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值