竞价网站怎么做seo做外贸没有网站可以吗
竞价网站怎么做seo,做外贸没有网站可以吗,网站改版 英文,成都高新网站建设#xff08;一#xff09;初识Redis1.1 认识NoSQL1.1.1 SQL和NoSQL的区别#xff1f;1.2 认识Redis1.2.1 Redis简介Redis全称为Remote Dictionary Server(远程词典服务器)#xff0c;是一个基于内存的键值型NoSQL数据库。1.2.2 Redis特征键值型单线程#xff0c;每个命令具…一初识Redis1.1 认识NoSQL1.1.1SQL和NoSQL的区别1.2 认识Redis1.2.1 Redis简介Redis全称为Remote Dictionary Server(远程词典服务器)是一个基于内存的键值型NoSQL数据库。1.2.2 Redis特征键值型单线程每个命令具有原子性低延迟速度快基于内存IO多路复用良好的编码支持数据持久化支持主从集群分片集群支持多语言客户端1.3 安装Redis1.3.1 在Ubuntu中安装Redis更新本地的软件包索引确保能获取到最新的软件版本sudo apt update安装 Redis 服务器redis-server 包含 Redis 服务及命令行工具sudo apt install redis-server -y安装完成后Redis 服务会自动启动。验证安装是否成功检查服务状态 ——sudo systemctl status redis-server—— 输出中包含 active (running)说明服务已正常运行。停止sudo systemctl stop redis-server启动sudo systemctl start redis-server重启sudo systemctl restart redis-server查看状态sudo systemctl status redis-server设置开机自启默认已启用sudo systemctl enable redis-server默认安装好后是开机自启的并且Redis 服务默认以守护进程daemon的方式在后台运行的。查看所有由 redis-server 包安装的文件及其完整路径dpkg -L redis-serverredis-server(Redis 服务端程序)/usr/bin/redis-serverredis-cli(Redis 命令行客户端)/usr/bin/redis-cli其他辅助工具如 redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel也都在 /usr/bin/ 目录下。这些命令已经加入系统 PATH因此可以在终端中直接输入 redis-server、redis-cli 等运行。主配置文件/etc/redis/redis.conf日志文件/var/log/redis/redis-server.log1.3.2 Redis命令行客户端redis-cli使用方式redis [options/选项] [commonds/命令]常见的options-h 127.0.0.1—— 指定要连接的Redis节点的IP地址默认是127.0.0.1-p 6379—— 指定要连接的Redis节点的端口默认是6379-a 密码—— 指定redis的访问密码Redis安装后默认没有密码。可以为Redis配置访问密码编辑配置文件(sudo nano /etc/redis/redis.conf) —— 找到 # requirepass foobared 这一行(去掉行首的 #并将 foobared 改为自己的密码) —— 保存并退出(nano 中按 CtrlO 保存CtrlX 退出) —— 重启redis(sudo systemctl restart redis-server)使用-a命令输入密码太危险了一般连接后使用AUTH命令进行验证(AUTH 密码)。commonds是redis的一些操作命令例如ping与Redis服务端做心跳测试服务端正常会返回pong不指定commonds时会进入 redis-cli 的交互控制台一般是不指定的。向数据库中存入字段set name jackset age 21(一共有16个库默认存到库0中)向数据库中取出字段get nameget age从命令行中查询库select 1(查询1号库)1.3.3 Redis的图形化界面客户端resp连接时输入的IP地址为虚拟机的IP地址。输入ip a命令可以知道当前虚拟机的IP地址。二Redis命令2.1 Redis数据结构介绍Redis是一个key-value型的数据库key一般是String类型value类型多种多样。通过帮助文档来了解各种数据类型是怎么用的通过官网可以找到帮助文档通过redis-cli命令行可以找到有关命令的帮助说明所有数据类型通用的指令help genericString类型的指令help stringlist类型的指令help list2.2 Redis通用命令通用命令是对任意数据类型都适用的一些命令。通过help [command]可以查看一个命令的常见用法。help keys常见命令KEYS查看符合模板的所有key不建议在生存环境下使用KEYS *查看所有的keyKEYS *a查看以a开头的keyDEL删除一个指定的key可以接受多个keyDEL k1 k2 k3EXISTS判断一个key是否存在可以接受多个keyEXPIRE给一个key设置有效期有效期到期时这个key会自动被删除为什么会存在有效期Redis是基于内存存储的。EXPIRE age 20给age这个key设置20秒的有效期expireTTL查看一个key的剩余有效期如果不设置key的有效期使用TTL查看会发现是-1,代表永久有效2.3 String类型String类型是字符串类型根据字符串的格式不同分为3类string 普通字符串(hello world)int 整数类型可以做自增、自减操作(10)float 浮点类型可以做自增、自减操作(3.5)底层都是字节数组形式存储只不过是编码形式不同最大空间不能超过512m。常见命令SET(set)添加或者修改已经存在的一个String类型的键值对GET(get)根据key获取String类型的valueMSET(mset)批量添加多个String类型的键值对MGET(mget)批量获取INCR(incr)让一个整型的key自增1DECR(decr)自减也可以通过设置自增-1实现自减INCRBY(incrby)让一个整型的key自增并指定步长例如incrby num 2 ——让num值自增2INCRBYFLOAT(incrbyfloat)让一个浮点类型的数字自增并指定步长SETNX(setnx)添加一个String类型的键值对前提是这个key不存在否则不执行(新增功能)SETEX(setex)添加一个String类型的键值对并且指定有效期2.4 key的层级格式Redis没有类似MySQL中的Table的概念我们该如何区分不同类型的key呢(用户有id商品也有id)Key的结构Redis的key允许有多个单词形成层级结构多个单词之间用:隔开格式如下项目名:业务名:类型:id并非固定2.5 Hash类型Hash类型也叫散列其value是一个无序字典类似于java中的HashMap结构。String结构将对象序列化为JSON字符串后存储当需要修改对象某个字段时很不方便。Hash结构可以将对象中的每个字段独立存储可以针对单个字段做CRUD。Hash的常见命令HSET key field value添加或者修改hash类型key的field的值HSET heima:user:3 name TomHGET key field获取一个hash类型key的field的值HGET heima:user:2 nameHMSET批量添加多个hash类型key的field的值HMSET heima:user:4 name Lucy age 19HMGET批量获取多个hash类型key的field的值HGETALL获取一个hash类型的key中的所有的field和valueHGETALL heima:user:1HKEYS获取一个hash类型的key中的所有的fieldHVALS获取一个hash类型的key中的所有的valueHINCRBY让一个hash类型key的字段值自增并指定步长HSETNX添加一个hash类型的key的field值前提是这个field不存在否则不执行。2.6 List类型Redis中的List类型与java中的LinkList类似可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。特征也与LinkList类似有序、元素可以重复、插入和删除快、查询速度一般。List的常见命令LPUSH key element ...(lpush)向列表左侧插入一个或多个元素LPUSH users 1 2 3LPOP key(lpop)移除并返回列表左侧的第一个元素没有则返回nilRPUSH key element ...(rpush)向列表右侧插入一个或多个元素RPOP key(rpop)移除并返回列表右侧的第一个元素LRANGE key star end(lrange)返回一段角标范围内的所有元素LRANGE users 1 2从队首数第二个元素到第三个元素角标从0开始BLPOP和BRPOP(blpop和brpop)与LPOP和RPOP类似只不过在没有元素时等待指定时间而不是直接返回nil阻塞时获取2.7 Set类型Redis的Set结构与java中的HashSet类似可以看做是一个value为null的HashMap。因为也是一个hash表因此具备与HashSet类似的特征无序、元素不可重复、查找快、支持交集、并集、差集等功能。Set类型的常用命令(单个集合的操作)SADD key member ...(sadd)向set中添加一个或多个元素sadd s1 a b cSREM key member ...(srem)移除set中的指定元素srem s1 aSCARD key(scard)返回set中元素的个数SISMEMBER key member(sismember)判断一个元素是否存在于set中SMEMBERS(smembers)获取set中的所有元素smembers s1多个集合之间的交互操作SINTER key1 key2 ...(sinter)求key1与key2的交集sinter zs lsSDIFF key1 key2 ...(sdiff)求key1与key2的差集sdiff zs lsSUNION key1 key2 ...(sunion)求key1和key2的并集sunion zs ls2.8 SortedSet类型Redis的SortedSet是一个可排序的set集合与java中的TreeSet有些类似但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score/得分属性可以基于score属性对元素排序底层的实现是一个跳表(SkipList)加hash表。具有以下特征可排序、元素不重复、查询速度快。常用于实现排行榜的功能。SortedSet的常见命令ZADD key score member(zadd)添加一个或多个元素到sorted set如果已经存在则更新其score值(分数在前元素在后)ZREM key member(zrem)删除sorted set中的一个指定元素ZSCORE key member(zscore)获取sorted set中的指定元素的score值ZRANK key member(zrank)获取sorted set中的指定元素的排名返回的排名从0开始ZCARD key(zcard)获取sorted set中的元素个数ZCOUNT key min max(zcount)统计score值在给定范围内的所有元素的个数ZINCRBY key increment menber(zincrby)让sorted set中的指定元素自增步长为指定的increment值ZRANGE key min max(zrange)按照score排序后获取指定排名范围内的元素ZRANGEBYSCORE key min max(zrangebyscore)按照score排序后获取指定score范围内的元素ZDIFF、ZINTER、ZUNION(zdiff、zinter、zunion)求差集、交集、并集所有的排名默认都是升序如果要降序则在命令的Z后面添加REV(rev)即可ZREVADD。三Redis的java客户端3.1 java客户端Jedis以命令作为方法名称线程不安全。Lettuce基于Netty实现线程安全支持同步、异步和响应式编程。spring官方默认使用。Redisson基于Redis实现的分布式、可伸缩的java数据结构的集合。SpringDataRedis底层可以兼容Jedis和Lettuce3.2 Jedis3.2.1 Jedis快速入门引入依赖dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version3.7.0/version /dependency建立连接private Jedis jedis; //BeforeEach标注在方法上表示该方法会在每一个测试方法 //即被 Test 标注的方法执行之前运行 BeforeEach void setUp() { //1. 建立连接 jedis new Jedis(192.168.101.131, 6379); //2. 设置密码 jedis.auth(123321); //3. 选择库 jedis.select(0); }操作Test void testString() { //存入数据 String result jedis.set(name,虎哥); System.out.println(result result); //获取数据 String name jedis.get(name); System.out.println(name name); }释放连接//AfterEach标注在方法上 // 表示该方法会在每一个测试方法执行之后运行。 AfterEach void tearDown() { if(jedis ! null) { jedis.close(); } }3.2.2 Jedis的连接池Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此使用Jedis连接池代替Jedis的直连方式。package com.heima.jedis.util; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisConnectionFactory { //连接池对象 private static final JedisPool jedisPool; static { //配置连接池 JedisPoolConfig poolConfig new JedisPoolConfig(); //配置最大连接数 poolConfig.setMaxTotal(8); //配置最大空闲连接 poolConfig.setMaxIdle(8); //配置最小空闲连接超过一段时间没人连,空闲连接被释放到0 poolConfig.setMinIdle(0); //配置等待时长(当连接池没有连接可用时等待的时间默认-1,无限等) poolConfig.setMaxWaitMillis(1000); //创建连接池对象 jedisPool new JedisPool(poolConfig, 192.168.101.131, 6379, 1000, 123321); } public static Jedis getJedis() { return jedisPool.getResource(); } }3.3 SpringDataRedis3.3.1 认识SpringDataRedisSpringData是Spring中数据操作的模块包含对各种数据库的集成其中对Redis的集成模块就叫做SpringDataRedis。特点提供了对不同Redis客户端的整合Lettuce和Jedis提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化和反序列化支持基于Redis的JDKCollection实现SpringDataRedis中提供了RedisTemplate工具类其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中3.3.2 RedisTemplate快速入门引入依赖!--redis依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis-test/artifactId scopetest/scope /dependency !--common-pool-- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency配置文件配置Redis的地址信息spring: data: redis: host: 192.168.101.131 port: 6379 password: 123321 #springboot默认实现lettuce如果想使用jedis需额外引入依赖 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 1000ms注入RedisTemplateAutowired private RedisTemplate redisTemplate;编写测试Test void testString() { //写入一条String数据 redisTemplate.opsForValue().set(name, 老杜); //获取string数据 Object name redisTemplate.opsForValue().get(name); System.out.println(name name); }3.3.3 RedisTemplate的RedisSerializerSpringDataRedis的序列化方式RedisTemplate可以接收任意Object作为值写入Redis只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的缺点可读性差、内存占用较大我们可以自定义RedisTemplate的序列化方式Configuration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) { //创建RedisTemplate对象 RedisTemplateString, Object template new RedisTemplate(); //设置连接工厂 template.setConnectionFactory(connectionFactory); //创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer(); //设置Key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); //设置Value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); //返回 return template; } }3.3.4 StringRedisTemplate在上一小节中使用JSON序列化工具时为了在反序列化时知道对象的类型JSON序列化器会将类的class类型写入json结果中存入Redis会带来额外的内存开销。为了节省内存空间我们并不会使用JSON序列化器来处理value而是统一使用String序列化器要求只能存储String类型的key和value当需要存储java对象时手动完成对象的序列化和反序列化。Spring默认提供了一个StringRedisTemplate类它的key和value的序列化方式默认就是String方式省去了我们自定义RedisTemplate的过程Autowired private StringRedisTemplate stringRedisTemplate; //序列化工具 private static final ObjectMapper mapper new ObjectMapper(); Test void testSaveUser() throws JsonProcessingException { //创建对象 User user new User(虎哥, 21); //手动序列化 String json mapper.writeValueAsString(user); //写入数据 stringRedisTemplate.opsForValue().set(user:200, json); //获取数据 String jsonUser stringRedisTemplate.opsForValue().get(user:200); //手动反序列化 User user1 mapper.readValue(jsonUser, User.class); System.out.println(user1 user1); }3.3.5 RedisTemplate操作Hash类型Test void testHash() { stringRedisTemplate.opsForHash().put(user:400, name, 虎哥); stringRedisTemplate.opsForHash().put(user:400, age, 21); MapNonNull Object, Object entries stringRedisTemplate.opsForHash().entries(user:400); System.out.println(entries entries); }