Redis入門教程


redis

​ Author:eden李秉秉秉秉

​ Version:9.0.1

一、Redis介紹

1.1 引言

  1. 由於用戶量增大,請求數量也隨之增大,數據壓力過大

  2. 多台服務器之間,數據不同步。

  3. 多台服務器之間的鎖,已經不存在互斥性了

image

1.2 NoSQL

​ Redis就是一款NoSQL

​ NoSQL -> 非關系型數據庫 -> Not Only SQL

  1. Key-Value:Redis

  2. 文檔型:ElasticSearch、Solr、MongoDB

  3. 面向列:Hbase,Cassandra

  4. 圖形化:Neo4j

​ 除了關系型數據庫都是非關系型數據庫。

​ NoSQL只是一種概念,泛指非關系型數據庫,和關系型數據庫做一個區分

1.3 Redis介紹

​ 有一位意大利人,在開發一款LLOOGG的統計頁面,因為MySQL的性能不好,自己研發了一款非關系型數據庫,並命名Redis。

​ Redis(Remote Dictionary Server)即遠程字典服務,Redis是由C語言去編寫,Redis是一款基於Key-Value的NoSQL,而且Redis是基於內存存儲數據的,Redis還提供了多種持久化機制,性能可以達到110000/s讀取數據,以及81000/s寫入數據,Redis還提供了主從、哨兵以及集群的搭建方式,可以更方便的橫向擴展以及垂直擴展

二、Redis安裝

2.1 安裝Redis

version: '3.1'
services:
  redis: 
    image: daocloud.io/library/redis:5.0.7
    restart: always
    container_name: redis
    environment:
     - TZ=Asia/Shanghai
    ports:
     - 6379:6379

2.2 使用Redis-cli連接Redis

​ 進去Redis容器的內部

​ docker exec -it 容器id bash

​ 在容器內部,使用redis-cli連接

2.3 使用圖形化界面連接Redis

​ 下載地址:https://github.com/lework/RedisDesktopManager-Windows/releases/tag/2020.5

​ 傻瓜式安裝

三、Redis常用命令

3.1 Redis存儲數據的結構

​ 常用的5種數據結構

  • key-string: 一個key對應一個值。

  • key-hash:一個key對應一個Map。

  • key-list:一個key對應一個列表。

  • key-set:一個key對應一個集合。

  • key-zset:一個key對應一個有序的集合。

    另外三種數據結構:

    HyperLogLog:計算近似值的。

    GEO:地理位置。

    BIT:一般存儲的也是一個字符串,存儲的是一個byte[]

五種常用的存儲數據結構圖

1

​ key-string:最常用的,一般用於存儲一個值。

​ key-hash:存儲一個對象數據的。

​ key-list:使用list結構實現棧和隊列結構。

​ key-set:交集、差集和並集的操作。

​ key-zset:排行榜、積分存儲等操作。

3.2 String常用命令

# 1. 添加值
set key value

# 2. 取值
get key

# 3. 批量操作
mset key value [key value...]
mget key [key...]

# 4. 自增命令(自增1)
incr key

# 5. 自減命令(自減1)
decr key

# 6. 自增或自減指定數量
incrby key increment
decrby key decrement

# 7. 設置值得同時,指定生存時間(每次向Redis添加數據時,盡量都設置上生存時間)
setex key second value

# 8. 設置值,如果當前key不存在的話(如果這個key存在,什么事都不做;如果這個key不存在,和set命令一樣)
setnx key value

# 9. 在key對應的value后追加內容
append key value

# 10. 查看value字符串的長度
strlen key

3.3 Hash常用命令

# 1. 存儲數據
hset key field value

# 2. 獲取數據
hget key field

# 3. 批量操作
hmset key field value [field value ...]
hmget key field [field...]

# 4. 自增(指定自增的值)
hincrby key field increment

# 5. 設置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hsetnx key field value

# 6. 檢查field是否存在
hexists key field

# 7. 刪除key對應的field,可以刪除多個
hdel key field [field]

# 8. 獲取當前hash結構中的全部field和value
hgetall key

# 9. 獲取當前hash結構中的全部field
hkeys key

# 10. 獲取當前hash結構中的全部value
hvals key

# 11. 獲取當前hash結構中field的數量
hlen key

3.4 List常用命令

# 1. 存儲數據(從左側插入數據,從右側插入數據)
lpush key value [value ...]
rpush key value [value ...]

# 2. 存儲數據(如果key不存在,什么事都不做,如果key存在,但是不是list結構,什么都不做)
lpushx key value
rpushx key value

# 3. 修改數據(在存儲數據時,指定好你的索引位置,覆蓋之前索引位置的數據,index超出整個列表的長度,也會失敗)
lset key index value

# 4. 彈棧方式獲取數據(左側彈出數據,右側彈出數據)
lpop key
rpop key

# 5. 獲取指定索引范圍的數據(start從0開始,stop輸入-1,代表最后一個,-2代表倒數第二個)
lrange key start stop

# 6. 獲取指定索引位置的數據
lindex key index

# 7. 獲取整個列表的長度
llen key

# 8. 刪除列表中的數據(它是刪除當前列表中的count個value值,count>0從左側向右側刪除,count<0從右側向左側刪除,count==0刪除列表中的全部value)
lrem key count value

# 9. 保留列表中的數據(保留你指定個索引范圍內的數據,超過整個索引范圍被移除掉)
ltrim key start stop

# 10. 將一個列表中的最后一個數據,插入到另外一個列表的頭部位置
rpoplpush list1 list2

3.5 Set常用命令(不允許重復、無序)

# 1. 存儲數據
sadd key member [member...]

# 2. 獲取數據(獲取全部數據)
smembers key

# 3. 隨機獲取一個數據(獲取的同時,移除數據,count默認為1,代表彈出數據的數量)
spop key [count]

# 4. 交集(取多個set集合交集)
sinter setl set 2 ...

# 5. 並集(獲取全部集合中的數據)
sunion setl set 2 ...

# 6. 差集(獲取多個集合中不一樣的數據)
sdiff setl set2...

# 7. 刪除數據
srem key member [member...]

# 8. 查看當前的set集合中是否包含這個值
sismember key member

3.6 zset常用命令

# 1. 添加數據(score必須是數值。member不允許重復的。)
zadd key score member [score member...]

# 2. 修改member的分數(如果member是存在於key中的,正常增加分數,如果memeber不存在,這個命令就相當於zadd)
zincrby key increment member

# 3. 查看指定的member的分數
zscore key member

# 4. 獲取zset中數據的數量
zcard key

# 5. 根據score的范圍查詢member數量
zcount key min max

# 6. 刪除zset中的成員
zrem key member [member...]I

# 7. 根據分數從小到大排序,獲取指定范國內的數據(withscores如果添加這個參數,那么會返回member對應的分數)
zrange key start stop [withscores]

# 8. 根據分數從大到小排序,獲取指定范圍內的數據(withscores如果添加這個參數,那么會返回member對應的分數)
zrevrange key start stop [withscores]

# 9. 根據分數的返回去獲取member(withscores代表同時返回score,添加1imit,就和MySQL中一樣,如果不希望等於min或者max的值被查詢出來可以采用‘(分數’相當於<但是不等於的方式,最大值和最小值使用+inf和-inf來標識)
zrangebyscore key min max [withscores] [limit offset count]

# 10. 根據分數的返回去獲取member(withscores代表同時返回score,添加limit,就和MySQL中一樣)
zrangebyscore key max min [withscores] [limit offset count]

3.7 key常用命令

# 1. 查看Redis中的全部的key(pattern:*,XXX*,*XXX)
keys pattern

# 2. 查看某一個key是否存在(1-key存在,0-key不存在)
exists key

# 3. 刪除key
del key [key...]

# 4. 設置key的生存時間,單位為秒,單位為毫秒,設置還能活多久
expire key second
pexpire key milliseconds

# 5. 設置key的生存時間,單位為秒,單位為毫秒,設置能活到什么時間點
expireat key timestamp
pexpireat key milliseconds

# 6. 查看key的剩余生存時間,單位為秒,單位為毫秒(-2-當前key不存在,-1-當前key沒有設置生存時間,具體剩余的生存時
間)
ttl key
pttl key

# 7. 移除key的生存時間(1 - 移除成功,0 - key不存在生存時間,key不存在)
persist key

# 8. 選擇操作的庫
select 0~15

# 9. 移動key到另外一個庫中
move key db

3.8 庫的常用命令

# 1. 清空當前所在的數據庫
flushdb

# 2. 清空全部數據庫
flushall

# 3. 查看當前數據庫中有多少個key
dbsize

# 4. 查看最后一次操作的時間
lastsave

# 5. 實時監控Redis服務接收到的目錄
monitor

四、Java連接Redis

​ Jedis連接Redis,Lettuce連接Redis。

4.1 Jedis連接Redis

​ 創建maven項目

​ 導入需要的依賴

<dependencies>
	<!--1、Jedis-->
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.9.0</version>
	</dependency>
	<!--2、Junit測試-->
	<dependency>
		<groupId>junit</groupId>
		<version>4.12</version>
	</dependency>
	<!--3、Lombok-->
	<dependency>
		<artifactId>1ombok</artifactId>
		<version>1.16.20</version>
	</dependency>
</dependencies>

​ 測試

public class Demo1 {
	@Test
	public void set() {
		//1.連接Redis
		Jedis jedis = new Jedis("192.168.199.109", 6379);
		//2.操作Redis - 因為Redis的命令是什么,Jedis的方法就是什么
		jedis.set("name", "李四");
		//3. 釋放資源
		jedis.close():
	}
	@Test 
	public void get (){
		//1.連接Redis
		Jedis jedis = new Jedis("192.168.199.109", 6379);
		//2.操作Redis-因為Redis的命令是什么,Jedis的方法就是什么
		String value = jedis.get("name") :
		System.out.println(value);
		//3. 釋放資源
		jedis.close():
	}
}

4.2 Jedis存儲一個對象到Redis以byte[]形式

​ 准備一個實體類

@Data
@NoArgsConstructor
@A11ArgsConstructor
public class User implements Serializable {
    private Integer id;
    private String name;
    private Date birthday;
}

​ 導入spring-context依賴

<!--4.導入spring-context-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.18.RELEASE</version>
</dependency>

​ 創建Demo測試類,編寫內容

public class Demo2{
    //存儲對象-以byte[]形式存儲在Redis中
    @Test
    public void setByteArray(){
        // 1. 連接Redis服務
        Jedis jedis = new Jedis("192.168.199.109",6379);
        //-------------------------
        // 2.1 准備key(String)-value(User)
        String key ="user";
        User value=new User(1,"張三",new Date());
        // 2.2 將key和value轉換為byte[]
        byte[] byteKey = SerializationUtils.serialize(key);
        byte[] byteValue = SerializationUtils.serialize(value);
        // 2.3 將key和value存儲到Redis
        jedis.set(byteKey,byteValue);
        //---------------------------
        // 3. 釋放資源
        jedis.close();
    }

    //獲取對象 - 以byte[]形式在Redis中獲取
    @Test
    public void getByteArray(){
        // 1. 連接Redis服務
        Jedis jedis = new Jedis("192.168.199.109",6379);
        //-----------------------------
        // 2.1 准備key
        String key = "user";
        // 2.2 將key轉換為byte[]
        byte[]bytekey=SerializationUtils.serialize(key);
        // 2.3 jedis去Redis中獲取value
        byte[]value=jedis.get(byteKey);
        // 2.4 將value反序列化為User對象
        User user = (User) SerializationUtils. deserialize(value);
        // 2.5 輸出
        System.out.println("user:"+user);
        //------------------------------
        // 3. 釋放資源
        jedis.close();
    }
}

4.3 Jedis存儲一個對象到Redis以String的形式

​ 導入依賴

<!--5.導入fastJSON-->
<dependency>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

​ 測試

public class Demo3{
    //存儲對象-以String形式存儲
    @Test
    public void setString(){
        //1.連接Redis
        Jedis jedis = new Jedis("192.168.199.109",6379);
        //2.1准備key(String)-value(User)
        String stringKey = "stringUser";
        User value = new User(2,"李四",new Date());
        //2.2使用fastJSON將value轉化為json字符串
        String stringValue = JSON. toJSONString(value);
        //2.3存儲到Redis中
        jedis.set(stringKey,stringValue);
        //3.釋放資源
        jedis.close();

        //獲取對象-以String形式獲取
        @Test
        public void getString(){
            //1.連接Redis
            Jedis jedis = new Jedis("192.168.199.109",6379);
            //2.1准備一個key
            String key = "stringUser";
            //2.2去Redis中查詢value
            String value = jedis . get ( key );
            //2.3將value反序列化為User
            User user = JSON.parseObject(value,User.class);
            //2.4輸出
            System.out.println("user:"+user);
            //3. 釋放資源
            jedis.close();
        }
    }

五、Redis其他配置及集群

六、Redis常見問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM