国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式學(xué)習(xí)第二天 redis學(xué)習(xí)

這篇具有很好參考價(jià)值的文章主要介紹了分布式學(xué)習(xí)第二天 redis學(xué)習(xí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1. 數(shù)據(jù)庫類型

1.1 基本概念

1.2 關(guān)系/非關(guān)系型數(shù)據(jù)庫搭配使用

2. Redis ?

2.1 基本知識(shí)點(diǎn)

2.2 redis常用命令

2.4 redis數(shù)據(jù)持久化

3 hiredis的使用

4. 復(fù)習(xí)


1. 數(shù)據(jù)庫類型

1.1 基本概念

  1. 關(guān)系型數(shù)據(jù)庫 - sql

    • 操作數(shù)據(jù)必須要使用sql語句

    • 數(shù)據(jù)存儲(chǔ)在磁盤

    • 存儲(chǔ)的數(shù)據(jù)量大

    • 舉例:

      • mysql

      • oracle

      • sqlite - 文件數(shù)據(jù)庫

      • sql server

  2. 非關(guān)系數(shù)據(jù)庫 - nosql

    • 操作不使用sql語句

      • 命令

    • 數(shù)據(jù)默認(rèn)存儲(chǔ)在內(nèi)存

      • 速度快, 效率高

      • 存儲(chǔ)的數(shù)據(jù)量小

    • 不需要數(shù)據(jù)庫表

      • 以鍵值對(duì)的方式存儲(chǔ)的

1.2 關(guān)系/非關(guān)系型數(shù)據(jù)庫搭配使用

分布式學(xué)習(xí)第二天 redis學(xué)習(xí)

?

==RDBMS: Relational Database Management System== 關(guān)系型數(shù)據(jù)庫

  1. 所有的數(shù)據(jù)默認(rèn)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中

  2. 客戶端訪問服務(wù)器, 有一些數(shù)據(jù), 服務(wù)器需要頻繁的查詢數(shù)據(jù)

    • 服務(wù)器首先將數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫中讀出 -> 第一次

      • 將數(shù)據(jù)寫入到redis中

    • 客戶端第二次包含以后訪問服務(wù)器

      • 服務(wù)器從redis中直接讀數(shù)據(jù)

2. Redis ?

  • 知道redis是什么?

    • 非關(guān)系型數(shù)據(jù)庫 也可以叫 內(nèi)存數(shù)據(jù)庫

  • 能干什么?

    • 存儲(chǔ)訪問頻率高的數(shù)據(jù)

    • 共享內(nèi)存

      • 服務(wù)器端 -> redis

  • 怎么使用?

    • 常用的操作命令

      • 各種數(shù)據(jù)類型 -> 會(huì)查

    • redis的配置文件

    • redis的數(shù)據(jù)持久化

    • 寫程序的時(shí)候如何對(duì)redis進(jìn)行操作

      • 客戶端 -> 服務(wù)器

2.1 基本知識(shí)點(diǎn)

  1. 安裝包下載

    • 英文官方: Redis

    • 中文官方: CRUG網(wǎng)站

  2. Redis安裝

    • make

    • make install

  3. redis中的兩個(gè)角色

# 服務(wù)器 - 啟動(dòng)
redis-server	# 默認(rèn)啟動(dòng)
redis-server confFileName # 根據(jù)配置文件的設(shè)置啟動(dòng) 遠(yuǎn)程
# 客戶端
redis-cli	# 默認(rèn)連接本地, 綁定了6379默認(rèn)端口的服務(wù)器
redis-cli -p 端口號(hào)
redis-cli -h IP地址 -p 端口 # 連接遠(yuǎn)程主機(jī)的指定端口的redis
# 通過客戶端關(guān)閉服務(wù)器
shutdown
# 客戶端的測(cè)試命令
ping [MSG]

redis中數(shù)據(jù)的組織格式

  • 鍵值對(duì)

    • key: 必須是字符串 - "hello"

    • value: 可選的

      • String類型

      • List類型

      • Set類型

      • SortedSet類型

      • Hash類型

redis中常用數(shù)據(jù)類型

  • String類型

    • 字符串

  • List類型

    • 存儲(chǔ)多個(gè)string字符串的

  • Set類型

    • 集合

      • stl集合

        • 默認(rèn)是排序的, 元素不重復(fù)

      • redis集合

        • 元素不重復(fù), 數(shù)據(jù)是無序的

  • SortedSet類型

    • 排序集合, 集合中的每個(gè)元素分為兩部分

      • [分?jǐn)?shù), 成員] -> [66, ''tom'']

  • Hash類型

    • 跟map數(shù)據(jù)組織方式一樣: key:value

      • Qt -> QHash, QMap

      • Map -> 紅黑樹

      • hash -> 數(shù)組

        • a[index] = xx?

2.2 redis常用命令

String類型

key -> string
value -> string
# 設(shè)置一個(gè)鍵值對(duì)->string:string
SET key value
# 通過key得到value
GET key
# 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)
MSET key value [key value ...]
# 同時(shí)查看過個(gè)key
MGET key [key ...]
# 如果 key 已經(jīng)存在并且是一個(gè)字符串, APPEND 命令將 value 追加到 key 原來的值的末尾
# key: hello, value: world, append: 12345 world12345
APPEND key value
# 返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度
STRLEN key
# 將 key 中儲(chǔ)存的數(shù)字值減一。
# 前提, value必須是數(shù)字字符串 -"12345"
DECR key

List類型 - 存儲(chǔ)多個(gè)字符串

key -> string
value -> list
# 將一個(gè)或多個(gè)值 value 插入到列表 key 的表頭
LPUSH key value [value ...]
# 將一個(gè)或多個(gè)值 value 插入到列表 key 的表尾 (最右邊)。
RPUSH key value [value ...]
# list中刪除元素
LPOP key # 刪除最左側(cè)元素
RPOP key # 刪除最右側(cè)元素
# 遍歷
LRANGE key start stop
	start: 起始位置, 0
	stop: 結(jié)束位置, -1
# 通過下標(biāo)得到對(duì)應(yīng)位置的字符串
LINDEX key index
# list中字符串的個(gè)數(shù)
LLEN key

Set類型

key -> string
value -> set類型 ("string", "string1")
# 添加元素
# 將一個(gè)或多個(gè) member 元素加入到集合 key 當(dāng)中,已經(jīng)存在于集合的 member 元素將被忽略
SADD key member [member ...]
# 遍歷
SMEMBERS key
# 差集
SDIFF key [key ...]
# 交集
SINTER key [key ...]
# 并集
SUNION key [key ...]

SortedSet 類型

key -> string
value -> sorted ([socre, member], [socre, member], ...)
# 添加元素
ZADD key score member [[score member] [score member] ...]
# 遍歷
ZRANGE key start stop [WITHSCORES] # -> 升序集合
ZREVRANGE key start stop [WITHSCORES] # -> 降序集合
# 指定分?jǐn)?shù)區(qū)間內(nèi)元素的個(gè)數(shù)
ZCOUNT key min max

Hash類型

分布式學(xué)習(xí)第二天 redis學(xué)習(xí)

?

key ->string
value -> hash ([key:value], [key:value], [key:value], ...)
# 添加數(shù)據(jù)
HSET key field value
# 取數(shù)據(jù)
HGET key field
# 批量插入鍵值對(duì)
HMSET key field value [field value ...]
# 批量取數(shù)據(jù)
HMGET key field [field ...]
# 刪除鍵值對(duì)
HDEL key field [field ...]

Key 相關(guān)的命令

# 刪除鍵值對(duì)
DEL key [key ...]
# 查看key值
KEYS pattern
查找所有符合給定模式 pattern 的 key 。
KEYS * 匹配數(shù)據(jù)庫中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
# 給key設(shè)置生存時(shí)長(zhǎng)
EXPIRE key seconds
# 取消生存時(shí)長(zhǎng)
PERSIST key
# key對(duì)應(yīng)的valued類型
TYPE key

配置文件是給redis服務(wù)器使用 的

  1. 配置文件位置

    • 從源碼安裝目錄中找 -> redis.conf

  2. 配置文件配置項(xiàng)

# redis服務(wù)器綁定誰之后, 誰就能訪問redis服務(wù)器
# 任何客戶端都能訪問服務(wù)器, 需要注釋該選項(xiàng)
bind 127.0.0.1 192.168.1.100 
# 保護(hù)模式, 如果要遠(yuǎn)程客戶端訪問服務(wù)器, 該模式要關(guān)閉
protected-mode yes
# reids服務(wù)器啟動(dòng)時(shí)候綁定的端口, 默認(rèn)為6379
port 6379
# 超時(shí)時(shí)長(zhǎng), 0位關(guān)閉該選項(xiàng), >0則開啟
timeout 0
# 服務(wù)器啟動(dòng)之后不是守護(hù)進(jìn)程 一般會(huì)使用yes 讓其為守護(hù)進(jìn)程
daemonize yes
# 如果服務(wù)器是守護(hù)進(jìn)程, 就會(huì)生成一個(gè)pid文件
# ./ -> reids服務(wù)器啟動(dòng)時(shí)候?qū)?yīng)的目錄
pidfile ./redis.pid
# 日志級(jí)別
 loglevel notice
# 如果服務(wù)器是守護(hù)進(jìn)程, 才會(huì)寫日志文件
 logfile "" -> 這是沒寫
 logfile "./redis.log" //打印的是終端的信息
 # redis中數(shù)據(jù)庫的個(gè)數(shù) 默認(rèn)是16個(gè) 類似于mysql中的database
 databases 16 
 	- 切換 select dbID [dbID == 0 ~ 16-1]

2.4 redis數(shù)據(jù)持久化

持久化: 數(shù)據(jù)從內(nèi)存到磁盤的過程 關(guān)機(jī)之后內(nèi)存的數(shù)據(jù)釋放了 但是存在磁盤上 下次可以直接讀取磁盤的數(shù)據(jù)

持久化的兩種方式: rgb和aof兩種方式

rgb數(shù)據(jù)完整性較低 但效率高 aof數(shù)據(jù)完整性高 但效率低

  • rdb方式

    • 這是一種默認(rèn)的持久化方式, 默認(rèn)打開

    • 磁盤的持久化文件xxx.rdb

    • 將內(nèi)存數(shù)據(jù)以二進(jìn)制的方式直接寫入磁盤文件

    • 文件比較小, 恢復(fù)時(shí)間短, 效率高

    • 以用戶設(shè)定的頻率 -> 容易丟失數(shù)據(jù)

    • 數(shù)據(jù)完整性相對(duì)較低

  • aof方式

    • 默認(rèn)是關(guān)閉的

    • 磁盤的持久化文件xxx.aof

    • 直接將生成數(shù)據(jù)的命令寫入磁盤文件

    • 文件比較大, 恢復(fù)時(shí)間長(zhǎng), 效率低

    • 以某種頻率 -> 1sec

    • 數(shù)據(jù)完整性高

# rdb的同步頻率, 任意一個(gè)滿足都可以 
save 900 1	//900s發(fā)生1次改變
save 300 10	//300發(fā)生10次改變
save 60 10000 
# rdb文件的名字
dbfilename dump.rdb


# 生成的持久化文件保存的那個(gè)目錄下, rdb和aof
dir ./ 

# 是不是要打開aof模式
appendonly no
 -> 打開: yes
# 設(shè)置aof文件的名字
appendfilename "appendonly.aof"
# aof更新的頻率
# appendfsync always
appendfsync everysec
# appendfsync no
  1. aof和rdb能不能同時(shí)打開?

    • 可以

  2. aof和rdb能不能同時(shí)關(guān)閉?

    • 可以

    • rdb如何關(guān)閉?

      save ""
  3. 兩種模式同時(shí)開啟, 如果要進(jìn)行數(shù)據(jù)恢復(fù), 如何選擇?

    • 效率上考慮: rdb模式

    • 數(shù)據(jù)的完整性: aof模式

3 hiredis的使用

  1. hiredis的安裝

    • 下載地址: Redis客戶端連接工具資料 -- Redis中文網(wǎng) -- Redis中國用戶組(CRUG)

    • 安裝

      • make

      • make

  2. hiredis API接口的使用

    連接數(shù)據(jù)庫
// 連接數(shù)據(jù)庫
redisContext *redisConnect(const char *ip, int port);
redisContext *redisConnectWithTimeout(const char *ip, 
                                      int port, const struct timeval tv);

執(zhí)行redis命令函數(shù)

// 執(zhí)行redis命令
void *redisCommand(redisContext *c, const char *format, ...);

//雖然返回的是void *實(shí)際上是redisply類型
// redisCommand 函數(shù)實(shí)際的返回值類型
typedef struct redisReply {
    /* 命令執(zhí)行結(jié)果的返回類型 */
    int type; 
    /* 存儲(chǔ)執(zhí)行結(jié)果返回為整數(shù) */
    long long integer;
    /* str變量的字符串值長(zhǎng)度 */
    size_t len;
    /* 存儲(chǔ)命令執(zhí)行結(jié)果返回是字符串, 或者錯(cuò)誤信息 */
    char *str;
    /* 返回結(jié)果是數(shù)組, 代表數(shù)據(jù)的大小 */
    size_t elements;
    /* 存儲(chǔ)執(zhí)行結(jié)果返回是數(shù)組*/
    struct redisReply **element;
} redisReply;

//訪問數(shù)組里面的元素
redisReply a[100];
element[i]->str
    
//根據(jù)類型取出對(duì)應(yīng)的值
type為類型
type狀態(tài)表示 含義
REDIS_REPLY_STRING==1 返回值是字符串,字符串儲(chǔ)存在redis->str當(dāng)中,字符串長(zhǎng)度為redi
REDIS_REPLY_ARRAY== 2 返回值是數(shù)組,數(shù)組大小存在redis->elements里面,數(shù)組值存儲(chǔ)在redis->element[i]里面。數(shù)組里面存儲(chǔ)的是指向redisReply的指針,數(shù)組里面的返回值可以通過redis->element[i]->str來訪問,數(shù)組的結(jié)果里全是type==REDIS_REPLY_STRING的redisReply對(duì)象指針。
REDIS_REPLY_INTEGER == 3 返回整數(shù)long long,從integer字段獲取值
REDIS_REPLY_NIL==4 返回值為空表示執(zhí)行結(jié)果為空
REDIS_REPLY_STATUS ==5 返回命令執(zhí)行的狀態(tài),比如set foo bar 返回的狀態(tài)為OK,存儲(chǔ)在str當(dāng)中 reply->str == "OK" 。
REDIS_REPLY_ERROR ==6 命令執(zhí)行錯(cuò)誤,錯(cuò)誤信息存放在 reply->str當(dāng)中。

?釋放資源

// 釋放資源
void freeReplyObject(void *reply);
void redisFree(redisContext *c);

案列代碼

#include <stdio.h>
#include <hiredis.h>

int main()
{
    // 1. 連接redis服務(wù)器
    redisContext* c = redisConnect("127.0.0.1", 6379);
    if (c->err != 0)
    {
        return -1;
    }
    // 2. 執(zhí)行redis命令
    void *prt = redisCommand(c, "hmset user userName zhang3 passwd 123456 age 23 sex man");
    redisReply* ply = (redisReply*)prt;
    if(ply->type == 5)
    {
        // 狀態(tài)輸出
        printf("狀態(tài): %s\n", ply->str);
    }
    freeReplyObject(ply);

    // 3. 從數(shù)據(jù)庫中讀數(shù)據(jù)
    prt = redisCommand(c, "hgetall user");
    ply = (redisReply*)prt;
    if(ply->type == 2)
    {
        // 遍歷
        for(int i=0; i<ply->elements; i+=2)
        {
            printf("key: %s, value: %s\n", ply->element[i]->str, ply->element[i+1]->str);
        }
    }
    freeReplyObject(ply);

    redisFree(c);
    return 0;
}

4. 復(fù)習(xí)

fastDFS

  • 是什么?

    • 分布式文件系統(tǒng)

  • 干什么?

    • 提供文件上傳

    • 提供文件下載

  • 怎么使用?

    • 根據(jù)主機(jī)的角色 -> 修改對(duì)應(yīng)的配置文件

    • 啟動(dòng)各個(gè)角色

fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf
 客戶端編寫

 ![1531272014374](1531272014374.png)

 - 操作步驟

   1. 創(chuàng)建管道 - pipe
   2. 創(chuàng)建子進(jìn)程
   3. 子進(jìn)程干什么?

      - 寫管道, 關(guān)閉讀端
        - 將標(biāo)準(zhǔn)輸出 -> 管道的寫端
      - 重定向
      - 執(zhí)行execl命令, 調(diào)用另外的進(jìn)程fdfs_upload_file
      - 子進(jìn)程退出
   4. 父進(jìn)程?
      - 讀管道, 關(guān)閉寫端
      - 釋放子進(jìn)程資源 - pcb
        - wait()/ waitpid()

實(shí)現(xiàn)代碼

fdfs.upload_file.h

#ifdef _FDFS_UPLOAD_FILE_H
#define _FDFS_UPLOAD_FILE_H

int upload_file1(const char *configfile, const char * myfile,char * fileid);
int upload_file2(const char * configFile, const char * upLoadFile, char * fileid, int size);

#endif

fdfs.upload_file.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include "fdfs_client.h"
#include "fdfs_upload_file.h"

//第一種方法 改寫源碼 將其改為底層可用
int upload_file1(const char *configfile, const char * myfile,char * fileid)
{
	char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
	ConnectionInfo *pTrackerServer;
	int result;
	int store_path_index;
	ConnectionInfo storageServer;

	if ((result=fdfs_client_init(configfile)) != 0)
	{
		return result;
	}

	pTrackerServer = tracker_get_connection();
	if (pTrackerServer == NULL)
	{
		fdfs_client_destroy();
		return errno != 0 ? errno : ECONNREFUSED;
	}

	*group_name = '\0';
	if ((result=tracker_query_storage_store(pTrackerServer, \
	                &storageServer, group_name, &store_path_index)) != 0)
	{
		fdfs_client_destroy();
		fprintf(stderr, "tracker_query_storage fail, " \
			"error no: %d, error info: %s\n", \
			result, STRERROR(result));
		return result;
	}

	result = storage_upload_by_filename1(pTrackerServer, \
			&storageServer, store_path_index, \
			myfile, NULL, \
			NULL, 0, group_name, fileid);
	if (result == 0)
	{
		printf("%s\n", fileid);
	}
	else
	{
		fprintf(stderr, "upload file fail, " \
			"error no: %d, error info: %s\n", \
			result, STRERROR(result));
	}

	tracker_disconnect_server_ex(pTrackerServer, true);
	fdfs_client_destroy();

	return result;
}

//第二種方法 使用execlp
//使用多進(jìn)程實(shí)現(xiàn)
int upload_file2(const char * configFile, const char * upLoadFile, char * fileid, int size)
{
	//1、創(chuàng)建管道
	int fd[2];
	int ret = pipe(fd);
	if (ret == -1)
	{
		perror("pipe error");
		return -1;
	}

	//2、創(chuàng)建子線程
	pid_t pid = fork();
	//如果是子線程
	if(pid == 0)
	{
		//3、重定向到管道的寫端 old,new
		dup2(fd[1], STDIN_FILENO);

		//關(guān)閉讀端
		close(fd[0]);

		//執(zhí)行exclp命令
		execlp("file_upload_file", "xxx", configFile, upLoadFile, NULL);
		perror("execlp error");
	}
	else 
	{
		//關(guān)閉寫端
		close(fd[1]);

		//讀取數(shù)據(jù) 將數(shù)據(jù)讀出到fileid參數(shù)中
		char buf[1024];
		read(fd[0], fileid, size);

		//回收子進(jìn)程
		wait(NULL);
	}
}

main.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "fdfs_upload_file.h"

//查找位置 在編譯時(shí)加上
//find / -name "fdfs_client.h"

int main(int argc, char **argv[])
{
    char fileID[1024];
    upload_file1("/etc/fdfs/client.conf", "main.c", fileID);
    printf("fileID: %s\n", fileID);
    printf("================================================================\n");

    upload_file2("/etc/fdfs/client.conf", "main.c", fileID, sizeof(fileID));
    printf("fileID: %s\n", fileID);
    return 0;
};

執(zhí)行 需要找到頭文件和庫文章來源地址http://www.zghlxwxcb.cn/news/detail-490564.html

gcc *.c -I /usr/include/fastdfs -I  /usr/include/fastcommon/ -lfdfsclient

到了這里,關(guān)于分布式學(xué)習(xí)第二天 redis學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 在Spring中,可以使用不同的方式來實(shí)現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實(shí)現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實(shí)現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等。下面是兩種常見的實(shí)現(xiàn)方式: 使用Redis實(shí)現(xiàn)分布式鎖: 使用自定義注解實(shí)現(xiàn)本地鎖: 以上是兩種常見的在Spring中實(shí)現(xiàn)分布式鎖的方式。第一種方式使用Redis作為分布式鎖的存儲(chǔ)介質(zhì),通過

    2024年03月17日
    瀏覽(24)
  • Redis學(xué)習(xí)(三)分布式緩存、多級(jí)緩存、Redis實(shí)戰(zhàn)經(jīng)驗(yàn)、Redis底層原理

    Redis學(xué)習(xí)(三)分布式緩存、多級(jí)緩存、Redis實(shí)戰(zhàn)經(jīng)驗(yàn)、Redis底層原理

    單節(jié)點(diǎn)Redis存在著: 數(shù)據(jù)丟失問題:?jiǎn)喂?jié)點(diǎn)宕機(jī),數(shù)據(jù)就丟失了。 并發(fā)能力和存儲(chǔ)能力問題:?jiǎn)喂?jié)點(diǎn)能夠滿足的并發(fā)量、能夠存儲(chǔ)的數(shù)據(jù)量有限。 故障恢復(fù)問題:如果Redis宕機(jī),服務(wù)不可用,需要一種自動(dòng)的故障恢復(fù)手段。 RDB持久化 RDB(Redis database backup file,Redis數(shù)據(jù)庫備份

    2024年02月16日
    瀏覽(32)
  • Redis學(xué)習(xí)(八)Java三種方式實(shí)現(xiàn)分布式鎖

    在分布式服務(wù)中,經(jīng)常有例如 定時(shí)任務(wù) 這樣的場(chǎng)景。 在定時(shí)任務(wù)中,如果不使用 quartz 這樣的分布式定時(shí)工具,只是簡(jiǎn)單使用 @Schedule 注解來實(shí)現(xiàn)定時(shí)任務(wù), 在服務(wù)分布式部署中 ,就有可能存在 定時(shí)任務(wù)并發(fā)重復(fù)執(zhí)行問題 。 對(duì)于解決以上場(chǎng)景中的問題,我們引入了 分布式

    2024年02月12日
    瀏覽(27)
  • Redis學(xué)習(xí)(三)持久化機(jī)制、分布式緩存、多級(jí)緩存、Redis實(shí)戰(zhàn)經(jīng)驗(yàn)

    Redis學(xué)習(xí)(三)持久化機(jī)制、分布式緩存、多級(jí)緩存、Redis實(shí)戰(zhàn)經(jīng)驗(yàn)

    單節(jié)點(diǎn)Redis存在著: 數(shù)據(jù)丟失問題:?jiǎn)喂?jié)點(diǎn)宕機(jī),數(shù)據(jù)就丟失了。 并發(fā)能力和存儲(chǔ)能力問題:?jiǎn)喂?jié)點(diǎn)能夠滿足的并發(fā)量、能夠存儲(chǔ)的數(shù)據(jù)量有限。 故障恢復(fù)問題:如果Redis宕機(jī),服務(wù)不可用,需要一種自動(dòng)的故障恢復(fù)手段。 RDB持久化 RDB(Redis database backup file,Redis數(shù)據(jù)庫備份

    2024年02月16日
    瀏覽(24)
  • 微服務(wù)學(xué)習(xí):SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    微服務(wù)學(xué)習(xí):SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目錄 一、高級(jí)篇 二、面試篇 ==============實(shí)用篇============== day05-Elasticsearch01 1.初識(shí)elasticsearch 1.4.安裝es、kibana 1.4.1.部署單點(diǎn)es 1.4.2.部署kibana 1.4.3.安裝IK分詞器 1.4.4.總結(jié) 2.索引庫操作 2.1.mapping映射屬性 2.2.索引庫的CRUD 2.2.1.創(chuàng)建索引庫和映射 2.2.2.查詢索引庫 2.2.3.修改索引庫 2.

    2024年02月02日
    瀏覽(24)
  • Redis緩存設(shè)計(jì)與性能優(yōu)化【緩存和數(shù)據(jù)庫不一致問題,解決方案:1.加過期時(shí)間這樣可以一段時(shí)間后自動(dòng)刷新 2.分布式的讀寫鎖】

    Redis緩存設(shè)計(jì)與性能優(yōu)化【緩存和數(shù)據(jù)庫不一致問題,解決方案:1.加過期時(shí)間這樣可以一段時(shí)間后自動(dòng)刷新 2.分布式的讀寫鎖】

    在大并發(fā)下,同時(shí)操作數(shù)據(jù)庫與緩存會(huì)存在數(shù)據(jù)不一致性問題 1、雙寫不一致情況 2、讀寫并發(fā)不一致 解決方案: 1、對(duì)于并發(fā)幾率很小的數(shù)據(jù)(如個(gè)人維度的訂單數(shù)據(jù)、用戶數(shù)據(jù)等),這種幾乎不用考慮這個(gè)問題,很少會(huì)發(fā)生緩存不一致, 可以給緩存數(shù)據(jù)加上過期時(shí)間,每隔一

    2024年04月13日
    瀏覽(29)
  • Redis與分布式-分布式鎖

    Redis與分布式-分布式鎖

    接上文 Redis與分布式-集群搭建 為了解決上述問題,可以利用分布式鎖來實(shí)現(xiàn)。 重新復(fù)制一份redis,配置文件都是剛下載時(shí)候的不用更改,然后啟動(dòng)redis服務(wù)和redis客戶。 redis存在這樣的命令:和set命令差不多,但是它有一個(gè)機(jī)制,當(dāng)指定的key不存在的時(shí)候,才能進(jìn)行插入,實(shí)

    2024年02月07日
    瀏覽(26)
  • Redis分布式鎖和分布式事務(wù)

    Redis分布式鎖和分布式事務(wù) 一、Redis分布式鎖 1.1 watch和事務(wù)實(shí)現(xiàn)分布式鎖 原理是通過watch來觀察一個(gè)變量,一個(gè)線程在操作的時(shí)候,其他線程會(huì)操作失敗,相當(dāng)于樂觀鎖。 1.2 setnx實(shí)現(xiàn)分布式鎖 原理是通過setnx設(shè)置一個(gè)變量,設(shè)置成功的線程搶到鎖,執(zhí)行相關(guān)的業(yè)務(wù),執(zhí)行完畢

    2024年02月09日
    瀏覽(25)
  • 【redis】redis分布式鎖

    一、為什么需要分布式鎖 1.在java單機(jī)服務(wù)中,jvm內(nèi)部有一個(gè)全局的鎖監(jiān)視器,只有一個(gè)線程能獲取到鎖,可以實(shí)現(xiàn)線程之間的互斥 2.當(dāng)有多個(gè)java服務(wù)時(shí),會(huì)有多個(gè)jvm,也會(huì)有多個(gè)鎖監(jiān)視器,這樣沒辦法使得多個(gè)jvm之間的線程互斥,所以無法使用jvm內(nèi)部的鎖監(jiān)視器,也就是s

    2023年04月25日
    瀏覽(27)
  • 分布式鎖實(shí)現(xiàn)(mysql,以及redis)以及分布式的概念

    分布式鎖實(shí)現(xiàn)(mysql,以及redis)以及分布式的概念

    我旁邊的一位老哥跟我說,你知道分布式是是用來干什么的嘛?一句話給我干懵了,我能隱含知道,大概是用來做分壓處理的,并增加系統(tǒng)穩(wěn)定性的。但是具體如何,我卻道不出個(gè)1,2,3?,F(xiàn)在就將這些做一個(gè)詳細(xì)的總結(jié)。至少以后碰到面試官可以說上個(gè)123。 那么就正式進(jìn)入

    2024年01月21日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包