建筑设计网站issuu邮件营销 wordpress
web/
2025/9/26 1:15:57/
文章来源:
建筑设计网站issuu,邮件营销 wordpress,公司企业网站制作教程,php网站开发招聘需求分析学习目标
redis 概念下载安装命令操作 1. 数据结构持久化操作使用Java客户端操作redis
Redis
前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念#xff1a; redis是一款高性能的NOSQL系列的非关系型数据库1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL)#xff0c;意即…学习目标
redis 概念下载安装命令操作 1. 数据结构持久化操作使用Java客户端操作redis
Redis
前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念 redis是一款高性能的NOSQL系列的非关系型数据库1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL)意即“不仅仅是SQL”是一项全新的数据库理念泛指非关系型的数据库。随着互联网web2.0网站的兴起传统的关系数据库在应付web2.0网站特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心暴露了很多难以克服的问题而非关系型的数据库则由于其本身的特点得到了非常迅速的发展NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战尤其是大数据应用难题。1.1.1. NOSQL和关系型数据库比较优点1成本nosql数据库简单易部署基本都是开源软件不需要像使用oracle那样花费大量成本购买使用相比关系型数据库价格便宜。2查询速度nosql数据库将数据存储于缓存之中关系型数据库将数据存储在硬盘中自然查询速度远不及nosql数据库。3存储数据的格式nosql的存储格式是key,value形式、文档形式、图片形式等等所以可以存储基础类型以及对象或者是集合等各种格式而数据库则只支持基础类型。4扩展性关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。缺点1维护的工具和资料有限因为nosql是属于新的技术不能和关系型数据库10几年的技术同日而语。2不提供对sql的支持如果不支持sql这样的工业标准将产生一定用户的学习和使用成本。3不提供关系型数据库对事务的处理。1.1.2. 非关系型数据库的优势1性能NOSQL是基于键值对的可以想象成表中的主键和值的对应关系而且不需要经过SQL层的解析所以性能非常高。2可扩展性同样也是因为基于键值对数据之间没有耦合性所以非常容易水平扩展。1.1.3. 关系型数据库的优势1复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。2事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库对方的优势就是自己的弱势反之亦然。1.1.4. 总结关系型数据库与NoSQL数据库并非对立而是互补的关系即通常情况下使用关系型数据库在适合使用NoSQL的时候使用NoSQL数据库让NoSQL数据库对关系型数据库的不足进行弥补。一般会将数据存储在关系型数据库中在nosql数据库中备份存储关系型数据库的数据1.2.主流的NOSQL产品• 键值(Key-Value)存储数据库相关产品 Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB典型应用 内容缓存主要用于处理大量数据的高访问负载。 数据模型 一系列键值对优势 快速查询劣势 存储的数据缺少结构化• 列存储数据库相关产品Cassandra, HBase, Riak典型应用分布式的文件系统数据模型以列簇式存储将同一列数据存在一起优势查找速度快可扩展性强更容易进行分布式扩展劣势功能相对局限• 文档型数据库相关产品CouchDB、MongoDB典型应用Web应用与Key-Value类似Value是结构化的数据模型 一系列键值对优势数据结构要求不严格劣势 查询性能不高而且缺乏统一的查询语法• 图形(Graph)数据库相关数据库Neo4J、InfoGrid、Infinite Graph典型应用社交网络数据模型图结构优势利用图结构相关算法。劣势需要对整个图做计算才能得出结果不容易做分布式的集群方案。什么是Redis
概述
Redis是用C语言开发的一个开源的高性能键值对key-value数据库官方提供测试数据50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s 且Redis通过提供多种键值数据类型来适应不同场景下的存储需
目前为止Redis支持的键值数据类型如下
字符串类型 string哈希类型 hash列表类型 list集合类型 set有序集合类型 sortedset
redis的应用场景 • 缓存数据查询、短连接、新闻内容、商品内容等等 • 聊天室的在线好友列表 • 任务队列。秒杀、抢购、12306等等 • 应用排行榜 • 网站访问统计 • 数据过期处理可以精确到毫秒 • 分布式集群架构中的session分离下载安装 1. 官网(国外网站网速不友好) 2. 国内中文网 3. 下载绿色压缩包就可以解压直接可以使用 4. redis目录结构如下: * redis.windows.conf配置文件 * redis-cli.exeredis的客户端 * redis-server.exeredis服务器端 * 另外几个使用来对redis进行配置优化操作(就不提了) * 注: redis默认的端口是6379, 可以使用conf进行修改
使用命令对redis的数据进行增删改查
redis的数据结构 redis存储的是key,value格式的数据其中key都是字符串value有5种不同的数据结构. value的数据结构 字符串类型: string(一个key只能对应一个String)哈希类型 hash map格式(一个key可以对应多个map)列表类型 list linkedlist格式(类似于管道, 一个key对应一个管道, 一个管道中可以多个数据, 因此一个key可以对应多个list)。支持重复元素集合类型 set ()不允许重复元素有序集合类型 sortedset不允许重复元素且元素有顺序 注: 不要把key与value搞混, 特别是哈希类型, 针对hash类型, 就记住一个大map中存一个小map 使用命令操作redis数据进行增删改查: 字符串类型 string 存储 set key value 127.0.0.1:6379 set username zhangsan 运行结果: OK 获取 get key 127.0.0.1:6379 get username 运行结果: “zhangsan”删除 del key 127.0.0.1:6379 del age 运行结果: (integer) 1 //表示对数据的操作个数 哈希类型 hash 存储 hset key field value 127.0.0.1:6379 hset myhash username lisi 运行结果: (integer) 1 127.0.0.1:6379 hset myhash password 123 运行结果: (integer) 1 获取 hget key field: 获取指定的field对应的值 127.0.0.1:6379 hget myhash username “lisi”hgetall key获取所有的field和value 127.0.0.1:6379 hgetall myhash 运行结果:
username
lisi
password
123删除 hdel key field 127.0.0.1:6379 hdel myhash username (integer) 1 列表类型 list:可以添加一个元素到列表的头部左边或者尾部右边 添加 push key value: 将元素加入列表左表 rpush key value将元素加入列表右边 127.0.0.1:6379 lpush myList a 运行结果: (integer) 1 127.0.0.1:6379 lpush myList b 运行结果: (integer) 2 127.0.0.1:6379 rpush myList c 运行结果: (integer) 3获取 lrange key start end 范围获取 127.0.0.1:6379 lrange myList 0 -1 运行结果: “b” “a” “c” 删除 lpop key 删除列表最左边的元素并将元素返回rpop key 删除列表最右边的元素并将元素返回 集合类型 set 不允许重复元素 存储sadd key value 127.0.0.1:6379 sadd myset a (integer) 1 127.0.0.1:6379 sadd myset a (integer) 0获取smembers key:获取set集合中所有元素 127.0.0.1:6379 smembers myset 运行结果: “a”删除srem key value:删除set集合中的某个元素 127.0.0.1:6379 srem myset a (integer) 1 有序集合类型 sortedset不允许重复元素且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 存储zadd key score value 127.0.0.1:6379 zadd mysort 60 zhangsan (integer) 1 127.0.0.1:6379 zadd mysort 50 lisi (integer) 1 127.0.0.1:6379 zadd mysort 80 wangwu (integer) 1获取zrange key start end [withscores] 127.0.0.1:6379 zrange mysort 0 -1 运行结果: “lisi” “zhangsan” “wangwu”127.0.0.1:6379 zrange mysort 0 -1 withscores 运行结果: “zhangsan” “60” “wangwu” “80” “lisi” “500” 删除zrem key value 127.0.0.1:6379 zrem mysort lisi (integer) 1 通用命令 keys * : 查询所有的键type key 获取键对应的value的类型del key删除指定的key value
注: 在redis中, 没有明确的修改数据的命令, 如果需要修改数据, 可以添加新的数据对原来的数据进行覆盖, 或者直接删除, 重新添加
持久化
redis是一个内存数据库当redis服务器重启获取电脑重启数据会丢失我们可以将redis内存中的数据持久化保存到硬盘的文件中。
redis持久化机制 RDB默认方式不需要进行配置默认就使用这种机制, redis在一定的间隔时间中检测key的变化情况然后持久化数据 操作步骤如下: 编辑redis.windwos.conf文件 # after 900 sec (15 min) if at least 1 key changed save 900 1 # after 300 sec (5 min) if at least 10 keys changed save 300 10 # after 60 sec if at least 10000 keys changed save 60 10000重新启动redis服务器并指定配置文件名称 D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9redis-server.exe redis.windows.conf AOF日志记录的方式可以记录每一条命令的操作。可以每一次命令操作后持久化数据 操作步骤如下: 编辑redis.windwos.conf文件 appendonly no关闭aof, 默认值 -- appendonly yes 开启aof # appendfsync always 每一次操作都进行持久化 appendfsync everysec 每隔一秒进行一次持久化 # appendfsync no 不进行持久化重新启动redis服务器, 并指定配置文件名称(这步操作与RDB操作的第二步一样)
Java使用Jedis连接redis进行数据操作
Java客户端 Jedis
Jedis: 一款java操作redis数据库的工具.使用maven导入Jedis的jar包 使用 //1. 获取连接Jedis jedis new Jedis(localhost,6379);//2. 操作jedis.set(username,zhangsan);//3. 关闭连接jedis.close();Jedis操作各种redis中的数据结构(Jedis中大多数方法名都是和redis的命令一样的, 在使用上具有很大的便利)
字符串类型 string set, get方法 //1. 获取连接Jedis jedis new Jedis();//如果使用空参构造默认值 localhost,6379端口//2. 操作//存储jedis.set(username,zhangsan);//获取String username jedis.get(username);System.out.println(username);//可以使用setex()方法存储可以指定过期时间的 key value//将activecodehehe键值对存入redis并且20秒后自动删除该键值对jedis.setex(activecode,20,hehe);//3. 关闭连接jedis.close();哈希类型 hash map格式 , hset, hget, hgetAll 函数 //1. 获取连接Jedis jedis new Jedis();//如果使用空参构造默认值 localhost,6379端口//2. 操作// 存储hashjedis.hset(user,name,lisi);jedis.hset(user,age,23);jedis.hset(user,gender,female);// 获取hashString name jedis.hget(user, name);System.out.println(name);// 获取hash的所有map中的数据MapString, String user jedis.hgetAll(user);// keysetSetString keySet user.keySet();for (String key : keySet) {//获取valueString value user.get(key);System.out.println(key : value);}//3. 关闭连接jedis.close();列表类型 list linkedlist格式。支持重复元素 lpush / rpush lpop / rpop lrange start end : 范围获取 //1. 获取连接Jedis jedis new Jedis();//如果使用空参构造默认值 localhost,6379端口//2. 操作// list 存储jedis.lpush(mylist,a,b,c);//从左边存jedis.rpush(mylist,a,b,c);//从右边存// list 范围获取ListString mylist jedis.lrange(mylist, 0, -1);System.out.println(mylist);// list 弹出String element1 jedis.lpop(mylist);//cSystem.out.println(element1);String element2 jedis.rpop(mylist);//cSystem.out.println(element2);// list 范围获取ListString mylist2 jedis.lrange(mylist, 0, -1);System.out.println(mylist2);//3. 关闭连接jedis.close();集合类型 set 不允许重复元素 sadd smembers:获取所有元素 //1. 获取连接Jedis jedis new Jedis();//如果使用空参构造默认值 localhost,6379端口//2. 操作// set 存储jedis.sadd(myset,java,php,c);// set 获取SetString myset jedis.smembers(myset);System.out.println(myset);//3. 关闭连接jedis.close();有序集合类型 sortedset不允许重复元素且元素有顺序 zadd zrange //1. 获取连接Jedis jedis new Jedis();//如果使用空参构造默认值 localhost,6379端口//2. 操作// sortedset 存储jedis.zadd(mysortedset,3,亚瑟);jedis.zadd(mysortedset,30,后裔);jedis.zadd(mysortedset,55,孙悟空);// sortedset 获取SetString mysortedset jedis.zrange(mysortedset, 0, -1);System.out.println(mysortedset);//3. 关闭连接jedis.close();jedis连接池 JedisPool 使用 创建JedisPool连接池对象调用方法 getResource()方法获取Jedis连接
//0.创建一个配置对象JedisPoolConfig config new JedisPoolConfig();config.setMaxTotal(50);config.setMaxIdle(10);//1.创建Jedis连接池对象JedisPool jedisPool new JedisPool(config,localhost,6379);//2.获取连接Jedis jedis jedisPool.getResource();//3. 使用jedis.set(hehe,heihei);//4. 关闭 归还到连接池中jedis.close();连接池工具类
public class JedisPoolUtils {private static JedisPool jedisPool;static{//读取配置文件InputStream is JedisPoolUtils.class.getClassLoader().getResourceAsStream(jedis.properties);//创建Properties对象Properties pro new Properties();//关联文件try {pro.load(is);} catch (IOException e) {e.printStackTrace();}//获取数据设置到JedisPoolConfig中JedisPoolConfig config new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty(maxTotal)));config.setMaxIdle(Integer.parseInt(pro.getProperty(maxIdle)));//初始化JedisPooljedisPool new JedisPool(config,pro.getProperty(host),Integer.parseInt(pro.getProperty(port)));}/*** 获取连接方法*/public static Jedis getJedis(){return jedisPool.getResource();}
}在Service层使用redis进行数据缓存
下面就只给出Service层的代码, 单纯说明redis: 代码流程:
第一次数据查询, 先看看redis中是否有缓存数据, 没有就先去mysql数据库中查找.将1中mysql查询的数据转化为Json格式存入redis中.第二次数据查询, 就到redis中进行查找.在恰当的时候使用持久化操作
Service层数据
package com.regotto.service.impl;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.regotto.dao.ProvinceDao;
import com.regotto.dao.impl.ProvinceDaoImpl;
import com.regotto.domain.Province;
import com.regotto.service.ProvinceService;
import com.regotto.utils.JedisUtils;
import redis.clients.jedis.Jedis;import java.util.List;/*** 服务层调用dao层进行查询操作* author regotto*/
public class ProvinceServiceImpl implements ProvinceService {private ProvinceDao provinceDao new ProvinceDaoImpl();//进行查询操作Overridepublic ListProvince findAll() {return provinceDao.findAll();}Overridepublic String findAllJson() {//使用前面定义的工具类Jedis jedis JedisUtils.getJedisPool();String provinceJson jedis.get(province);if (provinceJson null || provinceJson.length() 0) {System.out.println(redis 中没有数据, 查询数据库);//redis中没有数据, 就使用mysql的查询操作进行数据查询ListProvince provinceList provinceDao.findAll();ObjectMapper objectMapper new ObjectMapper();try {provinceJson objectMapper.writeValueAsString(provinceList);jedis.set(province, provinceJson);} catch (JsonProcessingException e) {e.printStackTrace();}} else {System.out.println(redis 中存在数据);}return provinceJson;}}
Servlet代码
package com.regotto.web;import com.fasterxml.jackson.databind.ObjectMapper;
import com.regotto.domain.Province;
import com.regotto.service.ProvinceService;
import com.regotto.service.impl.ProvinceServiceImpl;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;public class ProvinceServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//执行service层方法//ListProvince provinceList new ProvinceServiceImpl().findAll();//将provinceList数据序列化为json数据
// ObjectMapper objectMapper new ObjectMapper();
// String json objectMapper.writeValueAsString(provinceList);//使用redis做缓存改进String json new ProvinceServiceImpl().findAllJson();System.out.println(json);//响应结果response.setContentType(application/json;charsetutf-8);response.getWriter().println(json);}Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}
总结
注意使用redis缓存一些不经常发生变化的数据。数据库的数据一旦发生改变则需要更新缓存。数据库的表执行 增删改的相关操作需要将redis缓存数据情况再次存入在service对应的增删改方法中将redis数据删除。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81914.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!