中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

怎么做沒有后臺程序的網(wǎng)站網(wǎng)絡(luò)營銷計劃書怎么寫

怎么做沒有后臺程序的網(wǎng)站,網(wǎng)絡(luò)營銷計劃書怎么寫,上海工商網(wǎng)上注冊大廳,菠蘿蜜一區(qū)二免費進(jìn)入Redis是一個開源、高性能、內(nèi)存鍵值存儲數(shù)據(jù)庫,由 Salvatore Sanfilippo(網(wǎng)名antirez)創(chuàng)建,并在BSD許可下發(fā)布。它不僅可以用作緩存系統(tǒng)來加速數(shù)據(jù)訪問,還可以作為持久化的主數(shù)據(jù)存儲系統(tǒng)或消息中間件使用。Redis因其數(shù)…

Redis是一個開源、高性能、內(nèi)存鍵值存儲數(shù)據(jù)庫,由 Salvatore Sanfilippo(網(wǎng)名antirez)創(chuàng)建,并在BSD許可下發(fā)布。它不僅可以用作緩存系統(tǒng)來加速數(shù)據(jù)訪問,還可以作為持久化的主數(shù)據(jù)存儲系統(tǒng)或消息中間件使用。Redis因其數(shù)據(jù)結(jié)構(gòu)豐富、性能優(yōu)異和高可用性而被廣泛應(yīng)用在現(xiàn)代分布式架構(gòu)中。

目錄

一、認(rèn)識Redis

1.1、認(rèn)識NoSQL

1.2、認(rèn)識Redis

1.3、安裝Redis

二、Redis的常見命令

2.1、5種常見的數(shù)據(jù)結(jié)構(gòu)

2.2、通用命令

2.3、不同數(shù)據(jù)結(jié)構(gòu)的操作命令

三、Redis的Java客戶端

3.1、Jedis客戶端

3.2、SpringDataRedis客戶端


一、認(rèn)識Redis

1.1、認(rèn)識NoSQL

SQL:結(jié)構(gòu)化、表有關(guān)聯(lián)、支持SQL查詢、滿足事務(wù)的ACID、存儲在磁盤、垂直擴(kuò)展、適用于數(shù)據(jù)結(jié)構(gòu)固定,相關(guān)業(yè)務(wù)的數(shù)據(jù)安全性與一致性要求高的場合

NoSQL:非結(jié)構(gòu)、無關(guān)聯(lián)的、非SQL、滿足基本一致性、存儲在內(nèi)存、水平擴(kuò)展、適用于數(shù)據(jù)結(jié)構(gòu)不固定,對一致性與安全性要求不高,但是對性能要求較高的場合

常見的NoSQL有:鍵值對類型的Redis、文檔類型的MongoDB

1.2、認(rèn)識Redis

Redis(?Remote Dictionary Server)的全程是遠(yuǎn)程字典服務(wù)器,是一個基于內(nèi)存的非關(guān)系型數(shù)據(jù)庫。

redis的特征:
1.鍵值對類型的數(shù)據(jù)庫,支持豐富的數(shù)據(jù)類型

2.單線程,每個命令具備原子性

3.低延遲,速度快(基于內(nèi)存、IO多路復(fù)用、良好的編碼)

4.支持?jǐn)?shù)據(jù)的持久化

5.支持主從集群與分片集群

6.支持多語言客戶端

1.3、安裝Redis

這個不過多介紹,直接下載安裝即可。

安裝redis服務(wù)器和客戶端,并安裝redis可視化管理工具Another Redis Desktop Manager。

二、Redis的常見命令

2.1、5種常見的數(shù)據(jù)結(jié)構(gòu)

redis是一個鍵值對類型的數(shù)據(jù)庫,key的類型一般是String,value的類型就多種多樣:

基本數(shù)據(jù)類型:

String類型:緩存用戶信息、計數(shù)器(例如點贊數(shù)、瀏覽量)、簡單的鍵值對存儲等。

Hash類型:存儲用戶屬性集合(如用戶的姓名、年齡、地址等)、產(chǎn)品詳情等多字段數(shù)據(jù)結(jié)構(gòu)。

List類型:存儲用戶屬性集合(如用戶的姓名、年齡、地址等)、產(chǎn)品詳情等多字段數(shù)據(jù)結(jié)構(gòu)。

Set類型:適用于標(biāo)簽系統(tǒng)(給一篇文章打上多個標(biāo)簽)、唯一事件記錄等。

SortedSet類型:跳躍表提供O(log N)級別的插入、刪除和查找操作,并按分?jǐn)?shù)排序。

特殊數(shù)據(jù)類型:

GEO類型:Geo數(shù)據(jù)類型允許用戶存儲地理位置信息,并執(zhí)行地理半徑查詢、鄰近點搜索等操作。

BitMap類型:用于用戶在線狀態(tài)跟蹤、訪問統(tǒng)計(例如用戶是否讀過某篇文章)。

HyperLog類型:日活用戶統(tǒng)計、網(wǎng)站獨立訪客統(tǒng)計、廣告點擊去重等需要估算大量唯一元素數(shù)量而不需精確存儲所有元素的場景。

2.2、通用命令

通用命令常見的有:

KEYS:查看符合模板的所有key,不建議在生產(chǎn)環(huán)境上使用

DEL:刪除一個指定的key

EXISTS:判斷一個key是否存在

EXPIRE:為一個key設(shè)置有效期,有效期到了key會自動刪除

TTL:查看key的剩余有效期

2.3、不同數(shù)據(jù)結(jié)構(gòu)的操作命令

String類型:字符串類型,包括普通字符串,整數(shù),浮點數(shù)

API如下:

SET:添加或者修改string類型的鍵值對

GET:根據(jù)key獲取string類型的value

MSET:批量添加多個string類型的鍵值對

MGET:根據(jù)string類型的key獲取多個string類型的值

INCR:讓整型的key自增1

INCREBY:整數(shù)設(shè)置步長的自增

INCREBYFLOAT:按照指定步長的浮點型自增

SETNX:添加一個string類型的鍵值對,前提是key不存在,否則不執(zhí)行

SETEX:添加一個string類型的鍵值對,并指定有效期

redis的key允許有多個單詞形成層級結(jié)構(gòu),多個單詞用“:”隔開,如果value是一個Java對象,則可以將對象序列化成JSON字符串后存儲:
例如key可以為? 項目名:業(yè)務(wù)名:類型:id? ? ? value為{“id”:1,"product":"小米手機(jī)","price":"2999"}

這樣redis會根據(jù)冒號:進(jìn)行層級劃分。

Hash類型:也稱為散列,value是一個無序字典,類似于Java中的HashMap結(jié)構(gòu)。之前的string類型的value是將對象序列化成JSON字符串后存儲,當(dāng)需要修改某個字段時很不方便。

Hash結(jié)構(gòu)可以將每個字段獨立存儲,可以針對每個字段進(jìn)行操作。

相關(guān)的API:

HSET key field value:添加或者修改hash類型的key的field值

HGET key field:獲取一個hash類型的key的field值

HMSET:批量添加多個hash類型key的field值

HMGET:批量查詢多個hash類型key的field值

HGETALL:獲取一個hash類型key的所有feild的值

HKEYS:獲取一個hash類型的key中的所有feild

HVALS:獲取一個hash類型的key中的所有value

HINCREBY:讓hash類型的key自增并指定步長

HSETNX:添加一個hash類型的field,前提是field不存在,否則不執(zhí)行

List類型:List類型與Java中的LinkedList類似,可以看作是一個雙向鏈表,支持正向與反向檢索。

特征:有序、允許元素重復(fù)、插入刪除快、查詢速度一般

List的常見命令如下:

LPUSH key element...:向列表左側(cè)插入一個或者多個元素

LPOP key :移除并返回列表左側(cè)額第一個元素,沒有則返回nil

RPUSH key element...:向列表右側(cè)插入一個或者多個元素

RPOP key:移除并返回列表右側(cè)的第一個元素

LRANGE key? start end:返回一段角標(biāo)范圍內(nèi)的所有元素

BLPOP與BRPOP:移除指定的元素,沒有元素時并設(shè)置等待時間,而不是直接返回nil

List模擬棧:lpush與lpop? rpush與rpop

List模擬隊列:lpush與rpop

List模擬阻塞隊列:blpop與brpop

Set類型:Redis中的set與Java中的HashSet類似,具有如下特征:無序、元素不可重復(fù)、查找快

、支持交集、并集差集等操作。

SET類型的常見命令:

SADD key member...:向set中添加一個或者多個元素

SREM key member...:向set中移除指定元素

SCARD key:返回set中的元素個數(shù)

SISMEMBER key member:判斷一個元素是否在set中

SMEMBERS:獲取set中的所有元素

SINTER key1 key2:求兩個key的交集

SDIFF:求兩個集合的差集

SUNION:求兩個集合的并集

SortedSet類型:有序的集合,每個元素都帶有一個score屬性,可以根據(jù)score屬性進(jìn)行排序,底層是一個跳表+hash表的實現(xiàn)。跳躍表提供O(log N)級別的插入、刪除和查找操作,并按分?jǐn)?shù)排序;hash表用于快速查找成員的存在性。

跳表是通過隨機(jī)函數(shù)維護(hù)平衡性的,當(dāng)我們在跳表中插入數(shù)據(jù)的時候,我們通過選擇同時將這個數(shù)據(jù)插入到部分索引層中,如何選擇索引層,可以通過一個隨機(jī)函數(shù)來決定這個節(jié)點插入到哪幾級索引中,比如隨機(jī)生成了k,那么就將這個索引加入到,第一級到第k級索引中。

SortedSet具有以下特點:

1、可排序 2、元素不重復(fù) 3、查詢速度快

常見的SortedSort的api如下:默認(rèn)是升序,如果向降序前綴由Z改成ZREV

三、Redis的Java客戶端

3.1、Jedis客戶端

常見的Redis的Java客戶端有Jedis、Lettuce、Redisson三種,具體如下。

下面我們通過jedis客戶端連接redis服務(wù)器,并進(jìn)行單元測試,具體如下:

1.首先添加三方依賴。

    <!--jedis客戶端依賴--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!-- junit測試依賴 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency>

2.編寫單元測試模塊,jedis客戶端連接redis服務(wù)器,并進(jìn)行crud基本操作,最后釋放連接。

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** @author nuist__NJUPT* @ClassName JedisTest* @description: jedis測試類* @date 2024/03/02*/
public class JedisTest {private Jedis jedis ;@BeforeEachvoid setUp(){// 1.建立連接jedis = new Jedis("localhost", 6379) ;// 2.設(shè)置密碼jedis.auth("123456") ;// 3.選擇庫jedis.select(0) ;}@Testvoid testString(){// 存入數(shù)據(jù)String result = jedis.set("name", "mandy");System.out.println(result);// 獲取數(shù)據(jù)String name = jedis.get("name");System.out.println("name : " + name );}@Testvoid testHash(){// 存值jedis.hset("user:1", "name", "jack") ;jedis.hset("user:1", "age", "21") ;// 取值Map<String, String> stringStringMap = jedis.hgetAll("user:1");System.out.println(stringStringMap);}@AfterEachvoid tearDown(){if(jedis != null){jedis.close();}}}

jedis本身是線程不安全的,而且頻繁的創(chuàng)建與銷毀jedis連接會有性能損耗,因此推薦使用jedis連接池的方式代替直連的方式。

1.定義一個連接池工具類,用于建立jedis連接,并返回jedis對象,jedis使用完放回連接池而不是直接銷毀。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author nuist__NJUPT* @ClassName JedisConnectionFactory* @description: Jedis連接池* @date 2024/03/02*/
public class JedisConnectionFactory {private static final JedisPool jedisPool ;static {// 配置連接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(8);jedisPoolConfig.setMaxIdle(8);jedisPoolConfig.setMinIdle(0);jedisPoolConfig.setMaxWaitMillis(1000);// 創(chuàng)建連接池對象jedisPool= new JedisPool(jedisPoolConfig, "localhost", 6379, 1000, "123456");}public static Jedis getJedis(){return jedisPool.getResource() ;}}

2.客戶端直接通過連接池獲取jedis對象就可以,不用直接newjedis對象進(jìn)行直連了。

import com.alibaba.jedis.util.JedisConnectionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** @author nuist__NJUPT* @ClassName JedisTest* @description: jedis測試類* @date 2024/03/02*/
public class JedisTest {private Jedis jedis ;@BeforeEachvoid setUp(){// 1.建立連接// jedis = new Jedis("localhost", 6379) ;jedis = JedisConnectionFactory.getJedis() ;// 2.設(shè)置密碼jedis.auth("123456") ;// 3.選擇庫jedis.select(0) ;}@Testvoid testString(){// 存入數(shù)據(jù)String result = jedis.set("name", "mandy");System.out.println(result);// 獲取數(shù)據(jù)String name = jedis.get("name");System.out.println("name : " + name );}@Testvoid testHash(){// 存值jedis.hset("user:1", "name", "jack") ;jedis.hset("user:1", "age", "21") ;// 取值Map<String, String> stringStringMap = jedis.hgetAll("user:1");System.out.println(stringStringMap);}@AfterEachvoid tearDown(){if(jedis != null){jedis.close();}}}

3.2、SpringDataRedis客戶端

SpringData是Spring中數(shù)據(jù)操作的模塊,包含了對多種數(shù)據(jù)庫的集成,其中對redis的集成就是SpringDataRedis。它提供了對不同redis客戶端的整合(jedis、Lettuce),提供了RedisTemplate統(tǒng)一API來操作Redis,支持redis的發(fā)布訂閱模型,支持redis哨兵和redis集群,支持基于Lettuce的響應(yīng)式編程,支持序列化與反序列化。

下面看一下SpringDataRedis提供的工具類RedisTemplate的應(yīng)用,首先創(chuàng)建springboot項目并導(dǎo)入redis依賴。

  <!--	jackson依賴	--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version></dependency><!--redis依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 連接池依賴 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

然后在yml文件中進(jìn)行配值,配值redis的數(shù)據(jù)源信息。

spring:redis:host: 127.0.0.1port: 6379password: 123456lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100

編寫redisTemplate的配值類,防止在redis在接收Object類型時,把Object對象序列化成字節(jié)形式,變成一串亂碼,可讀性差,占用內(nèi)存。


/*** @author nuist__NJUPT* @ClassName RedisConfig* @description: redis配置類* @date 2024/03/02*/import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;@Configuration
public class RedisConfig {/*** RedisTemplate可以接收任意Object作為值寫入Redis,* 只不過寫入前會把Object序列化為字節(jié)形式,默認(rèn)是采用JDK序列化,得到的一串很長的值* 缺點:可讀性查、浪費存儲空間*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){// 1.創(chuàng)建 redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 2.設(shè)置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 3.設(shè)置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key 采用 String 序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value 采用 json 序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return  redisTemplate;}
}

定義一個實體類。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author nuist__NJUPT* @ClassName User* @description: 實體類* @date 2024/03/02*/@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String name ;private Integer age ;}

最后編寫單元測試模塊,利用redisTemplate進(jìn)行測試。

import com.alibaba.redisdemo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString(){// 添加一個元素redisTemplate.opsForValue().set("name", "Jack");// 獲取元素Object object = redisTemplate.opsForValue().get("name");System.out.println(object);}@Testvoid testSaveUser(){//寫入數(shù)據(jù)redisTemplate.opsForValue().set("user:2", new User("wang", 18));// 讀取數(shù)據(jù)User user = (User) redisTemplate.opsForValue().get("user:2");System.out.println(user);}@Testvoid testHash(){stringRedisTemplate.opsForHash().put("user:3","name", "liu");stringRedisTemplate.opsForHash().put("user:3","age","18") ;Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:3");System.out.println("entries = " + entries);}}

上述盡管Json序列化的方式滿足要求,但是會發(fā)現(xiàn)仍然存在一些問題,比如JSON序列化器將類型class寫入了json中,存入redis會導(dǎo)致額外的內(nèi)存開銷。

為了節(jié)省內(nèi)存空間,不使用JSON序列化來處理value,而是處理String序列化器,要求只能存儲String類型的key與value,當(dāng)存儲Java對象的時候需要手動的序列化與反序列化。

可以采用如下寫法:
?

 @Autowiredprivate StringRedisTemplate stringRedisTemplate ;private static final ObjectMapper mapper = new ObjectMapper() ;@Testvoid testSave() throws JsonProcessingException {// 創(chuàng)建對象User user = new User("wang", 18);// 手動序列化String s = mapper.writeValueAsString(user);//寫入數(shù)據(jù)stringRedisTemplate.opsForValue().set("user:2",s);// 讀取數(shù)據(jù)String user1 = stringRedisTemplate.opsForValue().get("user:2");// s手動反序列化User user2 = mapper.readValue(user1, User.class);System.out.println(user2);}

使用fastJson進(jìn)行序列化與反序列化也可以,需要添加依賴。

    @Autowiredprivate StringRedisTemplate stringRedisTemplate ;@Testvoid testSave() throws JsonProcessingException {// 創(chuàng)建對象User user = new User("wang", 19);// 手動序列化String s = JSON.toJSONString(user) ;//寫入數(shù)據(jù)stringRedisTemplate.opsForValue().set("user:2",s);// 讀取數(shù)據(jù)String user1 = stringRedisTemplate.opsForValue().get("user:2");// s手動反序列化User user2 = JSON.parseObject(user1, User.class) ;System.out.println(user2);}

添加fastJson依賴。

<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.32</version>
</dependency>

總結(jié):redis中有兩種序列化方式,推薦使用第二種。

1.第一種是自定義RedisTemplate,修改其序列化器,相對方便,但是寫入redis會存class對象,占用額外的內(nèi)存空間。

2.使用StringRedisTemplate,默認(rèn)使用String序列化器,寫入redis需要將Java對象手動序列化為json,讀取redis需要將讀取到的json反序列化為Java對象。

http://www.risenshineclean.com/news/51209.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)報價單鄭州網(wǎng)絡(luò)推廣團(tuán)隊
  • behance設(shè)計網(wǎng)站注冊各大網(wǎng)站域名大全
  • 網(wǎng)站建設(shè)有什么崗位網(wǎng)站發(fā)稿平臺
  • 關(guān)于網(wǎng)站建設(shè)的請示范文微信最好用的營銷軟件
  • 深圳最亂最窮的地方重慶百度seo排名
  • wordpress靜態(tài)生成頁面青島百度整站優(yōu)化服務(wù)
  • 上海網(wǎng)站設(shè)計聯(lián)系方式在線視頻觀看免費視頻22
  • 設(shè)計師個人網(wǎng)站模板湖州網(wǎng)站seo
  • 新疆網(wǎng)站建設(shè)咨詢谷歌paypal官網(wǎng)
  • 男女做那個網(wǎng)站動態(tài)圖片優(yōu)化設(shè)計七年級上冊語文答案
  • 行業(yè)信息網(wǎng)站建設(shè)方案房地產(chǎn)網(wǎng)站建設(shè)
  • 深圳網(wǎng)站建設(shè)php廈門seo全網(wǎng)營銷
  • 寧波seo整站優(yōu)化最新國際新聞50條簡短
  • 請人做網(wǎng)站誰來維護(hù)網(wǎng)站關(guān)鍵詞優(yōu)化怎么弄
  • 哪里查網(wǎng)站備案信息企業(yè)員工培訓(xùn)課程有哪些
  • 做網(wǎng)站平臺的營業(yè)執(zhí)照互聯(lián)網(wǎng)廣告推廣好做嗎
  • 廣州個人網(wǎng)站制作公司網(wǎng)絡(luò)推廣方案
  • 香港公司需要網(wǎng)站備案朋友圈廣告推廣平臺
  • 在百度上做網(wǎng)站推廣神器
  • 有關(guān)互聯(lián)網(wǎng)網(wǎng)站在線查詢網(wǎng)站收錄
  • dw網(wǎng)站二級頁面怎么做搜索引擎算法
  • 購買的網(wǎng)站如何換背景淘寶代運營靠譜嗎
  • 宜春seo網(wǎng)站推廣免費友情鏈接交換平臺
  • 網(wǎng)站開發(fā) 方案如何注冊網(wǎng)站怎么注冊
  • 網(wǎng)站建設(shè)所需硬件參數(shù)哪個平臺推廣效果最好
  • 企業(yè)級網(wǎng)絡(luò)管理長沙seo網(wǎng)絡(luò)公司
  • 在網(wǎng)上做翻譯的網(wǎng)站市場營銷策劃方案3000字
  • 一級a做爰片免費網(wǎng)站孕交視頻愛戰(zhàn)網(wǎng)關(guān)鍵詞挖掘查詢工具
  • 做網(wǎng)站學(xué)哪個語言最好網(wǎng)絡(luò)推廣人員
  • 只做美食類目產(chǎn)品的網(wǎng)站谷歌play商店