Redis基礎入門

第1章:引言

大家好!我是小黑,今天咱們來聊聊Redis。Redis,這個名字你可能在不少地方聽過,尤其是在后端開發領域,它可是個大名鼎鼎的角色。,Redis是一個開源的內存中數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。

咱們作為Java程序員,無論是處理高速緩存需求、實現快速的數據存取,還是在處理大數據量的場景下,Redis都能大顯身手。它的高性能、靈活性,以及簡單易用的特性,讓它成為了現代軟件開發中不可或缺的一部分。

第2章:Redis基本概念

什么是Redis?

Redis是一個鍵值存儲系統。和傳統的數據庫不同,它將數據存儲在內存中,這意味著數據的讀寫速度極快,非常適合需要快速讀寫操作的場景。而且,Redis還支持數據的持久化,但并不是絕對的持久化!可能存在數據丟失的風險!

Redis的主要特點
  1. 速度快:因為數據存儲在內存中,Redis的讀寫速度非常快,每秒可以處理超過十萬次讀寫操作。
  2. 支持多種數據結構:Redis不僅僅支持簡單的鍵值類型,還支持列表、集合、散列等多種數據結構,這使得Redis可以用于更加豐富的場景。
  3. 持久化:Redis支持兩種持久化方式,RDB(快照)和AOF(追加文件),確保數據的安全性。
  4. 支持事務:Redis的事務功能可以保證一系列操作要么全部完成,要么全部不執行。
  5. 豐富的功能:包括發布/訂閱、鍵過期等高級功能。
Redis與傳統數據庫的區別

Redis與傳統的關系型數據庫(比如MySQL)在很多方面都不同。最顯著的區別在于數據存儲的方式。Redis是內存數據庫,這意味著它的數據是存儲在內存中的,因此讀寫速度非常快。而傳統數據庫則是基于磁盤的,適合存儲大量持久化數據。因此,Redis通常用作快速緩存解決方案,來減少對主數據庫的訪問壓力。

Redis的使用場景
  • 緩存系統:最常見的用途,減少數據庫的訪問壓力。
  • 會話緩存(Session Store):存儲用戶會話信息。
  • 消息隊列系統:利用其發布/訂閱模式實現。
  • 排行榜/計數器:如網站的頁面訪問計數。
  • 快速響應的存儲系統:在需要快速讀寫操作的任何場景。

第3章:Redis數據類型與操作

咱們來深入探討一下Redis的數據類型和操作。Redis支持多種數據類型,這就像是咱們程序員的工具箱,每種工具都有其獨特的用途。接下來,讓咱們一起看看這些“工具”都有哪些神奇之處。

1. 字符串(String)

字符串是Redis最基本的類型,它可以存儲文本或二進制數據,最大能存儲512MB。

示例操作

// 設置一個鍵值對
SET mykey "Hello, Redis!"
// 獲取鍵的值
GET mykey
// 刪除鍵
DEL mykey

這些操作很基礎,但卻是日常使用中最頻繁的。

2. 列表(List)

Redis列表是簡單的字符串列表,按照插入順序排序。你可以在列表的頭部或尾部添加元素。

示例操作

// 在列表頭部添加元素
LPUSH mylist "world"
// 再添加一個元素
LPUSH mylist "hello"
// 獲取列表的所有元素
LRANGE mylist 0 -1

列表適合用于實現隊列和棧這樣的數據結構。

3. 集合(Set)

集合是字符串的無序集合。它是通過哈希表實現的,所以添加、刪除和查找的復雜度都是O(1)。

示例操作

// 添加元素到集合
SADD myset "Hello"
SADD myset "Redis"
// 獲取集合的所有成員
SMEMBERS myset

集合非常適合用來存儲無序且唯一的數據。

4. 散列(Hash)

Redis散列是鍵值對的集合。它們是特殊類型的字符串值,用于表示對象。

示例操作

// 存儲對象的多個字段
HSET myhash field1 "Hello" field2 "Redis"
// 獲取字段的值
HGET myhash field1
// 獲取所有字段和值
HGETALL myhash

散列適用于存儲對象。

5. 有序集合(Sorted Set)

有序集合與集合類似,但每個元素都會關聯一個浮點數分數。Redis正是通過分數來為集合中的成員進行從小到大的排序。

示例操作

// 添加元素到有序集合
ZADD myzset 1 "one"
ZADD myzset 2 "two"
// 獲取有序集合的成員
ZRANGE myzset 0 -1 WITHSCORES

有序集合非常適合用于排行榜或者優先隊列。

第4章:Redis命令基礎

Redis的魅力之一就在于它的命令,簡單卻強大,能讓咱們輕松地與Redis進行交互。接下來,我會帶大家一起看看這些常用的Redis命令,并通過一些實際的例子來展示它們是如何工作的。

使用redis-cli

首先,咱們得知道怎么和Redis“對話”。Redis提供了一個命令行界面工具,叫做redis-cli。通過它,咱們可以發送命令給Redis服務器,并獲取回應。

基本命令

讓我們從一些最基本的命令開始:

  1. SET和GET

    • SET命令用來設置鍵的值。
    • GET命令用來獲取鍵的值。

    示例

    // 設置鍵 "mykey" 的值為 "Hello Redis"
    SET mykey "Hello Redis"
    // 獲取鍵 "mykey" 的值
    GET mykey
    
  2. DEL

    • DEL命令用來刪除一個或多個鍵。

    示例

    // 刪除鍵 "mykey"
    DEL mykey
    
  3. EXISTS

    • EXISTS用于檢查鍵是否存在。

    示例

    // 檢查 "mykey" 是否存在
    EXISTS mykey
    
  4. KEYS

    • KEYS命令用于查找所有符合給定模式的鍵。

    示例

    // 查找所有以 "my" 開頭的鍵
    KEYS my*
    
  5. EXPIRE

    • EXPIRE設置鍵的過期時間。

    示例

    // 設置 "mykey" 60秒后過期
    EXPIRE mykey 60
    
  6. TTL

    • TTL命令用于獲取鍵的剩余過期時間。

    示例

    // 查詢 "mykey" 的剩余過期時間
    TTL mykey
    
高級命令

除了這些基礎命令,Redis還有許多高級功能的命令,如用于事務的MULTIEXECWATCH,以及用于發布/訂閱的PUBLISHSUBSCRIBE等。但這些內容,咱們會在后面的章節中詳細講解。

第5章:Java中使用Redis

Redis是一個強大的工具,特別是在需要快速訪問和處理大量數據的時候。那么,怎樣才能在Java項目中高效地使用Redis呢?接下來,我會向大家介紹一些常用的Java Redis客戶端,并通過具體的代碼示例來展示它們的使用方法。

常用的Java Redis客戶端

在Java世界里,有幾個流行的Redis客戶端可以選擇:

  1. Jedis:這是一個非常流行且簡單易用的Redis客戶端。
  2. Lettuce:這個客戶端是基于Netty的,支持異步和事件驅動,適用于高并發環境。
  3. Redisson:這個客戶端提供了許多高級功能,如分布式數據結構和同步器。
使用Jedis

現在,讓我們以Jedis為例,看一下如何在Java中使用它來操作Redis。

首先,咱們需要在Java項目中引入Jedis庫。如果你使用的是Maven,可以在pom.xml文件中添加如下依賴:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>最新版本號</version>
</dependency>

然后,咱們來看看如何使用Jedis來連接Redis并執行一些基本操作。

示例代碼

import redis.clients.jedis.Jedis;public class RedisExample {public static void main(String[] args) {// 連接到Redis服務器Jedis jedis = new Jedis("localhost", 6379);System.out.println("連接成功");// 設置字符串數據jedis.set("mykey", "Hello Redis!");// 獲取存儲的數據并輸出System.out.println("存儲的字符串為: " + jedis.get("mykey"));// 關閉連接jedis.close();}
}

在這個示例中,咱們創建了一個Jedis實例來連接本地的Redis服務器(假設它運行在默認端口6379上)。然后,咱們使用set方法設置了一個鍵值對,用get方法來獲取這個鍵的值,最后輸出到控制臺。

注意事項

當使用Jedis時,有幾點需要特別注意:

  1. 連接管理:確保正確地打開和關閉連接。
  2. 異常處理:適當地處理可能發生的異常。
  3. 線程安全:Jedis實例不是線程安全的,所以在多線程環境中需要特別小心。

第6章:Redis鍵值設計最佳實踐

在Redis中,合理地設計鍵名(key)和存儲結構是非常重要的。這不僅關系到數據的組織方式,還直接影響到查詢的效率和內存的使用。那么,怎樣才能設計出既有效又高效的Redis鍵值結構呢?讓我們一起來看看。

鍵名設計原則
  1. 明確且可讀:鍵名應該清晰地表達了它的用途。例如,user:1001:ordersu1001o 更容易理解。
  2. 保持簡潔:雖然Redis的鍵名最大可以是512MB,但實際中應盡可能地保持簡潔。過長的鍵名會增加內存的使用。
  3. 結構化:使用冒號(:)來構造命名空間,這是一種常見的實踐。例如,user:1001:profileuser:1001:settings
值的設計

值的設計取決于數據類型和具體用途。例如,對于簡單的數據可以使用字符串,而復雜的數據結構可能需要使用散列(hash)或列表(list)。

示例:用戶數據存儲

假設咱們要存儲用戶的訂單信息,可以這樣設計:

// 用戶ID
String userId = "1001";
// 訂單ID
String orderId = "5002";
// 訂單詳情
String orderDetails = "訂單詳情JSON或其他格式的字符串";// 設置用戶的訂單信息
jedis.set("user:" + userId + ":order:" + orderId, orderDetails);

在這個例子中,鍵名遵循了結構化的原則,通過冒號分隔不同的部分,使其既清晰又具有一定的邏輯結構。

鍵過期策略

在某些情況下,設置鍵的過期時間是非常有用的。例如,對于緩存數據,可以通過設置過期時間來自動刪除老舊的數據。

// 設置鍵的過期時間為1小時
jedis.expire("user:" + userId + ":order:" + orderId, 3600);
重要注意事項
  • 避免大量使用小鍵:大量的小鍵會占用額外的內存。
  • 使用掃描代替鍵:當需要獲取大量鍵時,使用SCAN命令代替KEYS,以避免阻塞服務器。
  • 避免過長的列表:特別長的列表(list)或集合(set)會影響性能。

第7章:總結

經過前面的章節,咱們已經一起走過了Redis的基礎知識、數據類型、基本操作,甚至還探討了如何在Java中使用Redis以及鍵值設計的最佳實踐。

Redis的基礎知識

首先,咱們介紹了Redis是什么,它的主要特點和與傳統數據庫的區別。記住,Redis是一個高性能的鍵值數據庫,數據存儲在內存中,所以讀寫速度非常快,適合作為緩存和消息中間件使用。

數據類型和操作

Redis支持多種數據類型,包括字符串(String)、列表(List)、集合(Set)、散列(Hash)和有序集合(Sorted Set)。每種類型都有其特定的應用場景和操作命令。例如,列表可以用來實現隊列和棧,而有序集合非常適合用于排行榜。

基本命令

我們學習了如何使用redis-cli進行基本的Redis操作,例如設置(SET)、獲取(GET)、刪除(DEL)鍵值對,以及檢查鍵是否存在(EXISTS)等。這些命令是Redis日常使用的基礎,非常重要。

Java中的Redis

在Java中使用Redis時,咱們可以選擇不同的客戶端,如Jedis、Lettuce或Redisson。每個客戶端都有其特點和使用場景。通過Jedis的簡單示例,我們了解了如何在Java應用中連接和操作Redis。

鍵值設計最佳實踐

鍵值的設計對于Redis的使用效率至關重要。咱們討論了一些設計原則,如使用結構化的鍵名、避免大量使用小鍵,以及設置合理的過期時間等。這些實踐可以幫助我們更高效地使用Redis。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

放棄原生SQL:Python中更優雅的數據庫操作

概要 在Python中&#xff0c;通過原生SQL語句進行數據庫操作是一種傳統的方式&#xff0c;但現代的Python開發中&#xff0c;使用ORM&#xff08;Object-Relational Mapping&#xff09;工具和數據庫連接庫可以更加高效和優雅地進行增刪改查操作。本文將詳細介紹Python中放棄原…

解決IDEA中多個項目不在同一窗口下顯示的問題和添加新的git的URL

以上是添加顯示多個項目 以下是給新添加的項目添加git

LeetCode算法題解(單調棧)|LeetCode84. 柱狀圖中最大的矩形

一、LeetCode84. 柱狀圖中最大的矩形 題目鏈接&#xff1a;84. 柱狀圖中最大的矩形 題目描述&#xff1a; 給定 n 個非負整數&#xff0c;用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰&#xff0c;且寬度為 1 。 求在該柱狀圖中&#xff0c;能夠勾勒出來的矩形的最大…

做外貿很多時候還是要學會隨機應變

馬上又要到年底了&#xff0c;相信已經有一部分小伙伴開啟了催單模式&#xff0c;希望客戶盡量在春節前將訂單落實下來&#xff0c;自然也有很多客戶會在春節前的這一段時間開始陸續拜訪自己觀望了很久的工廠。 其實對于貿易公司來說&#xff0c;對于來看工廠的客戶&#xff0…

ChatGPT,作為一種強大的自然語言處理模型,具備顯著優勢,能夠幫助您在各個領域取得突破

2023年隨著OpenAI開發者大會的召開&#xff0c;最重磅更新當屬GPTs&#xff0c;多模態API&#xff0c;未來自定義專屬的GPT。微軟創始人比爾蓋茨稱ChatGPT的出現有著重大歷史意義&#xff0c;不亞于互聯網和個人電腦的問世。360創始人周鴻祎認為未來各行各業如果不能搭上這班車…

Kotlin 作用域函數:理解 apply, let, 和 with

Kotlin提供了幾個作用域函數來優化和簡化代碼的結構。 本文將對比分析 apply, let, 和 with 三個函數。 一、對比分析&#xff1a; apply&#xff1a;在其接收者的上下文中執行代碼塊&#xff0c;并返回接收者對象。let&#xff1a;在其接收者的上下文中執行代碼塊&#xff…

Kotlin:內置函數let、also、with、run、apply

前言 在Kotlin中&#xff0c;有一些用于擴展 & 方便開發者編碼的內置函數&#xff0c;能大大提高開發者的開發效率。今天&#xff0c;我將主要講解的是&#xff1a; let函數also函數with函數run函數apply函數 基礎知識&#xff1a;接口回調中Lambda使用 在Kotlin中可使用…

棧和隊列的互相實現

用隊列實現棧 OJ鏈接 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int pop() 移除并返…

Mybatis XML增刪操作(結合上文)

先來"增"操作 在UserInfoXMLMapper.xml里面寫 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <…

nginx多端口部署

1.配置nginx.conf文件 有幾個端口需要部署就寫幾個server&#xff0c;我這里只部署了兩個端口分別為80和81端口&#xff0c;所以有兩個server文件。80端口項目入口在根目錄的test文件中&#xff0c;81端口項目入口在根目錄的test1文件夾中。 2.準備項目文件html文件 在/test1…

Dockerfile部署Java項目掛載使用外部配置文件

Dockerfile部署Java項目掛載使用外部配置文件 技術博客 http://idea.coderyj.com/ 需求是由于java項目使用的是nacos 而且每次部署nacos服務器ip不一樣導致要重新打包,想引入外部配置文件進行打包 1.需求是由于java項目使用的是nacos 而且每次部署nacos服務器ip不一樣導致要重新…

數據結構和算法專題---5、調度算法與應用

本章我們會對調度算法做個簡單介紹&#xff0c;包括常用的調度算法&#xff08;FCFS、SJF、RR、HPF&#xff09;的概述、實現方式、典型場景做個說明。 什么是調度算法 調度算法常見于操作系統中&#xff0c;因為系統資源有限&#xff0c;當有多個進程&#xff08;或多個進程…

Oracle 怎樣修改DB_NAME

DBNEWID 是一個數據庫實用程序&#xff0c;用于更改 Oracle 數據庫的 DBNAME 和 DBID。可以更改 DBID 或 DBNAME 或兩者。 DBNAME 是在創建數據庫時指定的數據庫名稱&#xff0c;DBID 是創建數據庫時分配給數據庫的唯一編號。 以下步驟演示如何使用 DBNEWID 實用程序更改 Oracl…

【論文閱讀筆記】序列數據的數據增強方法綜述

【論文閱讀筆記】序列數據的數據增強方法綜述 摘要 這篇論文探討了在深度學習模型中由于對精度的要求不斷提高導致模型框架結構變得更加復雜和深層的趨勢。隨著模型參數量的增加&#xff0c;訓練模型需要更多的數據&#xff0c;但人工標注數據的成本高昂&#xff0c;且由于客觀…

將RK3399的挖掘機開發板在Android10下設置系統默認為24小時制

將RK3399的挖掘機開發板在Android10下設置系統默認為24小時制 2023/12/9 22:07 應該也可以適用于RK3399的Android12系統 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml -2…

MagicAnimate

簡介 新加坡國立大學 Show 實驗室和字節聯合做了一項類似的研究。他們提出了一個基于擴散的框架 MagicAnimate&#xff0c;旨在增強時間一致性、忠實地保留參考圖像并提升動畫保真度。并且&#xff0c;MagicAnimate 項目是開源的&#xff0c;目前推理代碼和 gradio 在線 demo …

python程序大全(9)——鼠標亂動惡搞小病毒(有資源)

目錄 &#x1f3c6;一、前言 &#x1f3c6;二、程序第一版 &#x1f3c6;三、程序大魔改 &#x1f6a9;1、基礎改動 &#x1f6a9;2、打包 &#x1f6a9;3、F12保護機制 &#x1f6a9;4、添加開機自啟項 &#x1f6a9;5、自己也不懂的線程魔改 &#x1f3c6;四、最終代碼 &…

排列游戲 --- 動態規劃 --- 題解

目錄 排列游戲 題目描述 輸入描述: 輸出描述: 輸入 輸出 備注: 思路&#xff1a; 代碼&#xff1a; 排列游戲 K-排列游戲_牛客競賽動態規劃專題班習題課 (nowcoder.com) 時間限制&#xff1a;C/C 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C 262144K&#…

外包干了三年,我承認我確實廢了……

沒錯&#xff0c;我也干過外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我廢了…… 雖說廢的不是很徹底&#xff0c;但那三年我幾乎是出差了三年、玩了三年、荒廢了三年&#xff0c;那三年&#xff0c;我的技術能力幾乎是零成長的。 說起這段三年的外包經歷&a…

vue中滾輪縮放事件

在Vue中&#xff0c;可以使用原生JS的滾輪事件監聽來實現滾輪縮放&#xff1a; 首先在模板中給需要監聽滾輪事件的元素添加一個ref屬性&#xff0c;用于在Vue中獲取元素節點。 <template><div ref"scale"><!-- 需要縮放的內容 --></div> &…