Linux、Windows下Redis的安裝即Redis的基本使用詳解

来源:https://www.cnblogs.com/wren/archive/2022/09/27/16733098.html
-Advertisement-
Play Games

前言 什麼是Redis Redis是一個基於記憶體的key-value結構資料庫。Redis 是互聯網技術領域使用最為廣泛的存儲中間件,它是「Remote Dictionary Service」的首字母縮寫,也就是「遠程字典服務」。 [ ] 基於記憶體存儲,讀寫性能高 [ ] 適合存儲熱點數據(熱點商品 ...



前言


什麼是Redis


Redis是一個基於記憶體的key-value結構資料庫。Redis 是互聯網技術領域使用最為廣泛的存儲中間件,它是「Remote Dictionary Service」的首字母縮寫,也就是「遠程字典服務」。


在這裡插入圖片描述



在這裡插入圖片描述



在這裡插入圖片描述


使用Redis能做什麼


  • 數據緩存

  • 消息隊列

  • 註冊中心

  • 發佈訂閱


Redis入門


Redis簡介


Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻譯為:Redis是一個開源的記憶體中的數據結構存儲系統,它可以用作:資料庫、緩存和消息中間件。


官網:https://redis.io


Redis是用C語言開發的一個開源的高性能鍵值對(key-value)資料庫,官方提供的數據是可以達到100000+的QPS(每秒內查詢次數)。它存儲的value類型比較豐富,也被稱為結構化的NoSql資料庫。

NoSql(Not Only SQL),不僅僅是SQL,泛指非關係型資料庫。NoSql資料庫並不是要取代關係型資料庫,而是關係型資料庫的補充。


關係型資料庫(RDBMS):

  • Mysql

  • Oracle

  • DB2

  • SQLServer


非關係型資料庫(NoSql):

  • Redis

  • Mongo db

  • MemCached


Redis下載與安裝


Redis下載

Redis安裝包分為windows版和Linux版:

下載後得到下麵安裝包:


在這裡插入圖片描述


Redis安裝

1)在Linux中安裝Redis

在Linux系統安裝Redis步驟:

  1. 將Redis安裝包上傳到Linux

  2. 解壓安裝包,命令:tar -zxvf redis-4.0.0.tar.gz -C /usr/local

  3. 安裝Redis的依賴環境gcc,命令:yum install gcc-c++

  4. 進入/usr/local/redis-4.0.0,進行編譯,命令:make

  5. 進入redis的src目錄進行安裝,命令:make install

安裝後重點文件說明:


/usr/local/redis-4.0.0/src/redis-server:Redis服務啟動腳本

/usr/local/redis-4.0.0/src/redis-cli:Redis客戶端腳本

/usr/local/redis-4.0.0/redis.conf:Redis配置文件


2)在Windows中安裝Redis

Redis的Windows版屬於綠色軟體,直接解壓即可使用,解壓後目錄結構如下:


在這裡插入圖片描述


Redis服務啟動與停止


1)Linux系統中啟動和停止Redis

執行Redis服務啟動腳本文件redis-server


在這裡插入圖片描述


通過啟動日誌可以看到,Redis預設埠號為6379

Ctrl + C停止Redis服務

通過redis-cli可以連接到本地的Redis服務,預設情況下不需要認證即可連接成功。

退出客戶端可以輸入exit或者quit命令。


2)Windows系統中啟動和停止Redis

Windows系統中啟動Redis,直接雙擊redis-server.exe即可啟動Redis服務,redis服務預設埠號為6379


在這裡插入圖片描述


Ctrl + C停止Redis服務

雙擊redis-cli.exe即可啟動Redis客戶端,預設連接的是本地的Redis服務,而且不需要認證即可連接成功。


在這裡插入圖片描述


退出客戶端可以輸入exit或者quit命令。


Redis配置文件

前面我們已經啟動了Redis服務,預設情況下Redis啟動後是在前臺運行,而且客戶端不需要密碼就可以連接到Redis服務。如果我們希望Redis服務啟動後是在後臺運行,同時希望客戶端認證通過後才能連接到Redis服務,應該如果做呢?


此時就需要修改Redis的配置文件:

  • Linux系統中Redis配置文件:REDIS_HOME/redis.conf

  • Windows系統中Redis配置文件:REDIS_HOME/redis.windows.conf


通過修改Redis配置文件可以進行如下配置:

1) 設置Redis服務後臺運行

將配置文件中的daemonize配置項改為yes,預設值為no。

註意:Windows版的Redis不支持後臺運行。


2) 設置Redis服務密碼

將配置文件中的 # requirepass foobared 配置項取消註釋,預設為註釋狀態。foobared為密碼,可以根據情況自己指定。


3) 設置允許客戶端遠程連接Redis服務

Redis服務預設只能客戶端本地連接,不允許客戶端遠程連接。將配置文件中的 bind 127.0.0.1 配置項註釋掉。


解釋說明:

Redis配置文件中 # 表示註釋

Redis配置文件中的配置項前面不能有空格,需要頂格寫

daemonize:用來指定redis是否要用守護線程的方式啟動,設置成yes時,代表開啟守護進程模式。在該模式下,redis會在後臺運行

requirepass:設置Redis的連接密碼

bind:如果指定了bind,則說明只允許來自指定網卡的Redis請求。如果沒有指定,就說明可以接受來自任意一個網卡的Redis請求。


註意:修改配置文件後需要重啟Redis服務配置才能生效,並且啟動Redis服務時需要顯示的指定配置文件:


1)Linux中啟動Redis服務

# 進入Redis安裝目錄
cd /usr/local/redis-4.0.0
# 啟動Redis服務,指定使用的配置文件
./src/redis-server ./redis.conf

2)Windows中啟動Redis服務


在這裡插入圖片描述


由於Redis配置文件中開啟了認證校驗,即客戶端連接時需要提供密碼,此時客戶端連接方式變為:


在這裡插入圖片描述


解釋說明:

-h:指定連接的Redis服務的ip地址

-p:指定連接的Redis服務的埠號

-a:指定連接的Redis服務的密碼


Redis數據類型


Redis存儲的是key-value結構的數據,其中key是字元串類型,value有5種常用的數據類型:

  • 字元串 string

  • 哈希 hash

  • 列表 list

  • 集合 set

  • 有序集合 sorted set / zset


Redis 5種常用數據類型


在這裡插入圖片描述


解釋說明:

字元串(string):普通字元串,常用

哈希(hash):適合存儲對象

列表(list):按照插入順序排序,可以有重覆元素

集合(set):無序集合,沒有重覆元素

有序集合(sorted set / zset):集合中每個元素關聯一個分數(score),根據分數升序排序,沒有重覆元素


Redis常用命令


字元串string操作命令


Redis 中字元串類型常用命令:

  • SET key value 設置指定key的值

  • GET key 獲取指定key的值

  • SETEX key seconds value 設置指定key的值,並將 key 的過期時間設為 seconds 秒

  • SETNX key value 只有在 key 不存在時設置 key 的值

更多命令可以參考Redis中文網:https://www.redis.net.cn


哈希hash操作命令


Redis hash 是一個string類型的 field 和 value 的映射表,hash特別適合用於存儲對象,常用命令:

  • HSET key field value 將哈希表 key 中的欄位 field 的值設為 value

  • HGET key field 獲取存儲在哈希表中指定欄位的值

  • HDEL key field 刪除存儲在哈希表中的指定欄位

  • HKEYS key 獲取哈希表中所有欄位

  • HVALS key 獲取哈希表中所有值

  • HGETALL key 獲取在哈希表中指定 key 的所有欄位和值


在這裡插入圖片描述


列表list操作命令


Redis 列表是簡單的字元串列表,按照插入順序排序,常用命令:

  • LPUSH key value1 [value2] 將一個或多個值插入到列表頭部

  • LRANGE key start stop 獲取列表指定範圍內的元素

  • RPOP key 移除並獲取列表最後一個元素

  • LLEN key 獲取列表長度

  • BRPOP key1 [key2 ] timeout 移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超 時或發現可彈出元素為止


在這裡插入圖片描述


集合set操作命令


Redis set 是string類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重覆的數據,常用命令:

  • SADD key member1 [member2] 向集合添加一個或多個成員

  • SMEMBERS key 返回集合中的所有成員

  • SCARD key 獲取集合的成員數

  • SINTER key1 [key2] 返回給定所有集合的交集

  • SUNION key1 [key2] 返回所有給定集合的並集

  • SDIFF key1 [key2] 返回給定所有集合的差集

  • SREM key member1 [member2] 移除集合中一個或多個成員


在這裡插入圖片描述


有序集合sorted set操作命令


Redis sorted set 有序集合是 string 類型元素的集合,且不允許重覆的成員。每個元素都會關聯一個double類型的分數(score) 。redis正是通過分數來為集合中的成員進行從小到大排序。有序集合的成員是唯一的,但分數卻可以重覆。


常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的 分數

  • ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合中指定區間內的成員

  • ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment

  • ZREM key member [member ...] 移除有序集合中的一個或多個成員


在這裡插入圖片描述


通用命令

Redis中的通用命令,主要是針對key進行操作的相關命令:

  • KEYS pattern 查找所有符合給定模式( pattern)的 key

  • EXISTS key 檢查給定 key 是否存在

  • TYPE key 返回 key 所儲存的值的類型

  • TTL key 返回給定 key 的剩餘生存時間(TTL, time to live),以秒為單位

  • DEL key 該命令用於在 key 存在是刪除 key


在Java中操作Redis


前面我們講解了Redis的常用命令,這些命令是我們操作Redis的基礎,那麼我們在java程式中應該如何操作Redis呢?這就需要使用Redis的Java客戶端,就如同我們使用JDBC操作MySQL資料庫一樣。


Redis 的 Java 客戶端很多,官方推薦的有三種:

  • Jedis

  • Lettuce

  • Redisson

Spring 對 Redis 客戶端進行了整合,提供了 Spring Data Redis,在Spring Boot項目中還提供了對應的Starter,即 spring-boot-starter-data-redis。


Jedis


Jedis 是 Redis 的 Java 版本的客戶端實現。

maven坐標:

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.8.0</version>
</dependency>

使用 Jedis 操作 Redis 的步驟:

  1. 獲取連接

  2. 執行操作

  3. 關閉連接


示例代碼:

package com.execise.test;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;

/**
 * 使用Jedis操作Redis
 */
public class JedisTest {

    @Test
    public void testRedis(){
        //1 獲取連接
        Jedis jedis = new Jedis("localhost",6379);
        
        //2 執行具體的操作
        jedis.set("username","xiaoming");

        String value = jedis.get("username");
        System.out.println(value);

        //jedis.del("username");

        jedis.hset("myhash","addr","bj");
        String hValue = jedis.hget("myhash", "addr");
        System.out.println(hValue);

        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //3 關閉連接
        jedis.close();
    }
}

Spring Data Redis


Spring Data Redis 是 Spring 的一部分,提供了在 Spring 應用中通過簡單的配置就可以訪問 Redis 服務,對 Redis 底層開發包進行了高度封裝。在 Spring 項目中,可以使用Spring Data Redis來簡化 Redis 操作。


網址:https://spring.io/projects/spring-data-redis


在這裡插入圖片描述


maven坐標:

<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-redis</artifactId>
	<version>2.4.8</version>
</dependency>

Spring Boot提供了對應的Starter,maven坐標:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Data Redis中提供了一個高度封裝的類:RedisTemplate,針對 Jedis 客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation介面,具體分類如下:

  • ValueOperations:簡單K-V操作

  • SetOperations:set類型數據操作

  • ZSetOperations:zset類型數據操作

  • HashOperations:針對hash類型的數據操作

  • ListOperations:針對list類型的數據操作


使用方式


環境搭建

第一步:創建maven項目springdataredis_demo,配置pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/>
    </parent>
    <groupId>com.execise</groupId>
    <artifactId>springdataredis_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.5</version>
            </plugin>
        </plugins>
    </build>
</project>

第二步:編寫啟動類

package com.execise;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

}

第三步:配置application.yml

spring:
  application:
    name: springdataredis_demo
  #Redis相關配置
  redis:
    host: localhost
    port: 6379
    #password: 123456
    database: 0 #操作的是0號資料庫
    jedis:
      #Redis連接池配置
      pool:
        max-active: 8 #最大連接數
        max-wait: 1ms #連接池最大阻塞等待時間
        max-idle: 4 #連接池中的最大空閑連接
        min-idle: 0 #連接池中的最小空閑連接

解釋說明:

spring.redis.database:指定使用Redis的哪個資料庫,Redis服務啟動後預設有16個資料庫,編號分別是從0到15。

可以通過修改Redis配置文件來指定資料庫的數量。


第四步:提供配置類

package com.execise.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置類
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //預設的Key序列化器為:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }
}

解釋說明:

當前配置類不是必須的,因為 Spring Boot 框架會自動裝配 RedisTemplate 對象,但是預設的key序列化器為JdkSerializationRedisSerializer,導致我們存到Redis中後的數據和原始數據有差別


第五步:提供測試類

package com.execise.test;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;
    
}

操作字元串類型數據

/**
 * 操作String類型數據
*/
@Test
public void testString(){
    //存值
    redisTemplate.opsForValue().set("city123","beijing");

    //取值
    String value = (String) redisTemplate.opsForValue().get("city123");
    System.out.println(value);

    //存值,同時設置過期時間
    redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);

    //存值,如果存在則不執行任何操作
    Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
    System.out.println(aBoolean);
}

操作哈希類型數據

/**
 * 操作Hash類型數據
*/
@Test
public void testHash(){
    HashOperations hashOperations = redisTemplate.opsForHash();

    //存值
    hashOperations.put("002","name","xiaoming");
    hashOperations.put("002","age","20");
    hashOperations.put("002","address","bj");

    //取值
    String age = (String) hashOperations.get("002", "age");
    System.out.println(age);

    //獲得hash結構中的所有欄位
    Set keys = hashOperations.keys("002");
    for (Object key : keys) {
        System.out.println(key);
    }

    //獲得hash結構中的所有值
    List values = hashOperations.values("002");
    for (Object value : values) {
        System.out.println(value);
    }
}

操作列表類型數據

/**
 * 操作List類型的數據
*/
@Test
public void testList(){
    ListOperations listOperations = redisTemplate.opsForList();

    //存值
    listOperations.leftPush("mylist","a");
    listOperations.leftPushAll("mylist","b","c","d");

    //取值
    List<String> mylist = listOperations.range("mylist", 0, -1);
    for (String value : mylist) {
        System.out.println(value);
    }

    //獲得列表長度 llen
    Long size = listOperations.size("mylist");
    int lSize = size.intValue();
    for (int i = 0; i < lSize; i++) {
        //出隊列
        String element = (String) listOperations.rightPop("mylist");
        System.out.println(element);
    }
}

操作集合類型數據

/**
 * 操作Set類型的數據
*/
@Test
public void testSet(){
    SetOperations setOperations = redisTemplate.opsForSet();

    //存值
    setOperations.add("myset","a","b","c","a");

    //取值
    Set<String> myset = setOperations.members("myset");
    for (String o : myset) {
        System.out.println(o);
    }

    //刪除成員
    setOperations.remove("myset","a","b");

    //取值
    myset = setOperations.members("myset");
    for (String o : myset) {
        System.out.println(o);
    }

}

操作有序集合類型數據

/**
 * 操作ZSet類型的數據
*/
@Test
public void testZset(){
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();

    //存值
    zSetOperations.add("myZset","a",10.0);
    zSetOperations.add("myZset","b",11.0);
    zSetOperations.add("myZset","c",12.0);
    zSetOperations.add("myZset","a",13.0);

    //取值
    Set<String> myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }

    //修改分數
    zSetOperations.incrementScore("myZset","b",20.0);

    //取值
    myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }

    //刪除成員
    zSetOperations.remove("myZset","a","b");

    //取值
    myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }
}

通用操作

/**
 * 通用操作,針對不同的數據類型都可以操作
*/
@Test
public void testCommon(){
    //獲取Redis中所有的key
    Set<String> keys = redisTemplate.keys("*");
    for (String key : keys) {
        System.out.println(key);
    }

    //判斷某個key是否存在
    Boolean uname = redisTemplate.hasKey("uname");
    System.out.println(uname);

    //刪除指定key
    redisTemplate.delete("myZset");

    //獲取指定key對應的value的數據類型
    DataType dataType = redisTemplate.type("myset");
    System.out.println(dataType.name());

}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、關機重啟命令 shutdown -h now 立刻進行關機 halt 關機 reboot 重啟電腦 sync 把記憶體數據同步到磁碟 ==關機重啟命令均需要root許可權執行== 二、用戶登錄和註銷命令 su username: 切換用戶,不帶任何參數會進入root;低許可權用戶切換高許可權用戶需要輸入 ...
  • 一、本地數據集上傳到到數據倉庫Hive 1、 實驗數據集的下載 1. 將user.zip下載到指定目錄 2.給hadoop用戶賦予針對bigdatacase目錄的各種操作許可權 3.創建一個dataset目錄用於保存數據集 4.解壓縮user.zip文件 5.可以看到dataset目錄下由兩個文件 6 ...
  • 超級跳躍日:Super Leap Day是一款非常有趣的橫版跑酷冒險游戲,游戲操作簡單,只需要按下單個按鈕即可連續跳躍,沿途還有很多獎勵和物品等待你來收集,並且每天都有新的關卡等你來挑戰,喜歡的朋友快來體驗吧~ 詳情:超級跳躍日Super Leap Day for mac(動作冒險游戲) 游戲介紹 ...
  • 如果轉載, 請註明出處 https://www.cnblogs.com/milton/p/16730512.html Ubuntu22.40下VNC和遠程桌面的區別 使用遠程桌面時, 用戶必須在host上登入桌面環境. 可以是鎖屏或非鎖屏, 但是必須要有一個用戶桌面會話存在. 使用VNC時, hos ...
  • 摘要:面向教育模式的轉變,南京功夫豆攜手華為雲IoT,給印表機配上與雲端互通的智能盒子,開啟雲端列印新模式 本文分享自華為雲社區《一臺“厲害”的印表機:雲+IoT,開啟雲端列印新模式》,作者:華為IoT雲服務 。 後疫情時代 生活的各方面都在往線上模式延展 而在不被人註意的角落裡 印表機也在悄悄地提 ...
  • 1. 前言 什麼是Linux Linux是一套免費使用和自由傳播的操作系統。說到操作系統,大家比較熟知的應該就是Windows和MacOS操作系統,我們今天所學習的Linux也是一款操作系統。 為什麼要學Linux 那麼我們為什麼要學習Linux呢,主要出於兩個方面的原因。 1). 企業用人要求 以 ...
  • cobbler部署 #先關閉防火牆和selinux [root@localhost ~]# systemctl disable firewalld [root@localhost ~]# setenforce 0 //cobbler服務,selinux必須得是disabled狀態,所以要重啟 [ro ...
  • 前幾天裝了幾台伺服器測試,在使用的過程中發現,每次重啟系統,登錄界面會彈出網卡提示 “r8169 0000:02:00 eth0 Invalid ocp reg 17758!” 系統版本: 經過測試發現: 1、開機前將eth0/eth1網口插上網線,系統啟動後識別到eth0/eth1網口有網線連接, ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...