主頁 > 資料庫 > Redis-Redis基本型別及使用Java操作

Redis-Redis基本型別及使用Java操作

2020-09-10 14:55:30 資料庫

1 Redis簡介     Redis(REmote Dictionary Server)是一個使用ANSI C撰寫的、開源的、支持網路的、基于記憶體的、可持久化的鍵值對存盤系統,目前最流行的鍵值對存盤系統, 經常被用作資料庫、快取以及訊息佇列等, redis的優點
  • 基于記憶體的資料庫,效率比磁盤型的快;
  • Redis的作業模式為單執行緒,不需要執行緒間的同步操作,Redis采用單執行緒主要因為其瓶頸在記憶體和寬帶上,而不是在CPU上;
  • Redis中的key-value的value可是是字串、鏈表、集合、散串列等;
  • redis支持資料持久化,可以采用RDB、AOF、RDB&AOF三種方案;
  • Redis支持主從結構,可以利用從實體進行資料備份;
2 Redis資料結構簡介
  1. STRING(字串);
  2. LIST(串列);
  3. SET(集合)
  4. HASH(散列)
  5. ZSET(有序集合)
Java使用Redis 1、引入Maven依賴
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>
2、測驗
1 @Test
2 public void test01(){
3     Jedis jedis = new Jedis("localhost");
4  
5     jedis.set("hello","world");
6  
7     System.out.println(jedis.get("hello"));
8 }

 

  下面介紹五種基本型別的使用;

2.1.1 STRING(字串);     Redis的字串就是一個由位元組組成的序列,字串可以存盤3種型別的值;
  • 字串
  • 整數
  • 浮點數   

Redis自增命令和自減命令

  java使用Redis實作自增、自減命令:
 1 @Test
 2 public void test02(){
 3     Jedis jedis = new Jedis("localhost");
 4 
 5 
 6     jedis.set("num","10");
 7     // 11
 8     System.out.println(jedis.incr("num"));
 9     // 31
10     System.out.println(jedis.incrBy("num",20));
11     // 11
12     System.out.println(jedis.decrBy("num",20));
13 }

  java使用Redis處理子串:

 1 @Test
 2 public void test03() {
 3     Jedis jedis = new Jedis("localhost");
 4     // redis存盤字串
 5     jedis.set("str","hello");
 6     System.out.println(jedis.get("str"));
 7     // 字串追加
 8     jedis.append("str","world");
 9     System.out.println(jedis.get("str"));
10     // 取子串
11     System.out.println(jedis.getrange("str",5,9));
12     // 指定位置插入字串(會把指定位置之后的字串覆寫)
13     jedis.setrange("str",5,",jiz");
14     System.out.println(jedis.get("str"));
15 }

  運行結果:

2.1.2 串列       Redis允許用戶從序列的兩端推入或者彈出元素,獲取串列元素以及執行各種常見的串列操作;可用來存盤任務資訊、最近瀏覽過的文章或常用聯系人資訊,  

Redis對串列的基本操作

 

 1 @Test
 2 public void test04() {
 3     Jedis jedis = new Jedis("localhost");
 4     // 1 2
 5     jedis.rpush("list", "1", "2");
 6     // 1
 7     System.out.println(jedis.rpop("list")); //2
 8     // 3 1
 9     jedis.lpush("list","3");
10     // 1
11     System.out.println(jedis.lpop("list")); //3
12     // 3 2 1
13     jedis.lpush("list", "2", "3");
14     // 獲得位置為1的元素
15     System.out.println(jedis.lindex("list",1)); // 3
16 }

 

 

   阻塞彈出命令和彈出并推入命令,最常見的用例就是訊息佇列(nessaging)和任務佇列(task queue);

 

                Redis阻塞式串列操作

 

 1 @Test
 2 public void test05() {
 3     Jedis jedis = new Jedis("localhost");
 4     // item1 item2 item3 item4
 5     jedis.rpush("list1", "item1", "item2", "item3", "item4");
 6     // 彈出最左端的元素 item2 item3 item4
 7     System.out.println(jedis.blpop(0, "list1"));
 8     // 彈出最右端的元素 item2 item3
 9     System.out.println(jedis.brpop(0, "list1"));
10     // 彈出最右端的元素,將其推入到新佇列的最左端,并向用戶回傳該元素 list1=> item2  list2=>item3
11     System.out.println(jedis.rpoplpush("list1", "list2")); // item3
12     // 彈出最右端的元素,將其推入到新佇列的最左端,并向用戶回傳該元素 如果list1無元素,等待timeout list1=> item2  list2=>item2,item3
13     System.out.println(jedis.brpoplpush("list1", "list2",10));
14 }

 

 

    2.1.3 集合          Redis的集合以無序的方式來存盤多個各不相同的元素,用戶可以快速對集合執行添加元素、移除元素操作以及檢查一個元素是否在集合中;  

Redis對集合的操作

 1 @Test
 2 public void test06() {
 3     Jedis jedis = new Jedis("localhost");
 4     // 生成set 存入元素
 5     jedis.sadd("set", "a", "b", "c", "c");
 6     System.out.println(jedis.smembers("set"));
 7     // 移除 b 元素
 8     jedis.srem("set", "b");
 9     System.out.println(jedis.smembers("set"));
10     // 檢查 a 元素是否在集合中
11     System.out.println(jedis.sismember("set", "a"));
12     // 查詢set中元素個數
13     System.out.println(jedis.scard("set"));
14     // 隨機回傳一個或者多個元素,若count為正數,回傳的隨機元素不會重復;若count為負數,回傳的隨機元素可能會重復;
15     System.out.println(jedis.srandmember("set", 1));
16     // 隨機的移除元素
17     System.out.println(jedis.spop("set"));
18     // 移除set指定的元素到set2,移除成功回傳1,否則回傳0
19     if (jedis.smove("set", "set2", "b") > 0) {
20         System.out.println("success");
21         System.out.println(jedis.smembers("set2"));
22     }else {
23         System.out.println("error");
24         System.out.println(jedis.smembers("set"));
25     }

 

 

 

 

    命令可用于并集運算、交集運算和差集運算,     2.1.4 散列     Redis的散列可以讓用戶將多個鍵值對存盤到一個Redis建里面,將一些相關的資料存盤在一起,  

 

 

 1 @Test
 2 public void test07() {
 3     Jedis jedis = new Jedis("localhost");
 4     Map<String, String> map = new HashMap<>();
 5     map.put("k1", "value1");
 6     map.put("k2", "value2");
 7     map.put("k3", "value3");
 8     // 存盤hash值
 9     jedis.hmset("hash-set", map);
10     // 獲取指定的key的值
11     System.out.println(jedis.hmget("hash-set", "k1", "k2"));
12     System.out.println(jedis.hmget("hash-set", "k1"));
13     // 洗掉指定的key
14     jedis.hdel("hash-set", "k1");
15     System.out.println(jedis.hmget("hash-set", "k1"));
16     // 統計個數
17     System.out.println(jedis.hlen("hash-set"));
18 }

 

 

 1 @Test
 2 public void test08() {
 3     Jedis jedis = new Jedis("localhost");
 4     Map<String, String> map = new HashMap<>();
 5     map.put("num1", "10");
 6     map.put("num2", "20");
 7     map.put("num3", "30");
 8     // 存盤hash值
 9     jedis.hmset("num-set", map);
10     // 檢查指定的key是否存盤在散列中
11     System.out.println(jedis.hexists("num-set", "num1"));
12     //System.out.println(jedis.hexists("num-set", "num4"));
13     // 獲取散串列中包含的所有鍵
14     System.out.println(jedis.hkeys("num-set"));
15     // 獲取散串列中包含的所有值
16     System.out.println(jedis.hvals("num-set"));
17     // 獲取所有鍵值對
18     System.out.println(jedis.hgetAll("num-set"));
19     // 將key存盤的值加整數increment
20     jedis.hincrBy("num-set", "num1", 20);
21     System.out.println(jedis.hgetAll("num-set"));
22     // 將key存盤的值加浮點數
23     jedis.hincrByFloat("num-set", "num2", 20.8);
24     System.out.println(jedis.hgetAll("num-set"));
25 }

  2.1.4 有序集合        存盤成員與分值之間的映射,并且提供了分值處理命令,根據分值大小有序的獲取(fetch)或掃描(scan)成員和分值的命令,  

 

 

@Test
public void test09() {
    Jedis jedis = new Jedis("localhost");


    // 生成有序集合
    jedis.zadd("zset-key", new HashMap<String, Double>() {{
        put("a", 1d);
        put("b", 2d);
        put("c", 3d);
    }});
    // 回傳有序集合包含的成員數量
    System.out.println(jedis.zcard("zset-key"));
    // 有序集合內指定的值+increment
    jedis.zincrby("zset-key", 5d, "a");
    // 回傳成員member的值
    System.out.println(jedis.zscore("zset-key", "a"));
    // 回傳分值介于min和max之間的成員數量
    System.out.println(jedis.zcount("zset-key", 4, 7));
    // 回傳有序集合中排名介于start和stop之間的成員,
    System.out.println(jedis.zrange("zset-key", 0, 3));
    System.out.println(jedis.zrange("zset-key", 2, 3));
    // 如果給定了可選的WITHSCORES選項,那么成員的分值也回傳
    System.out.println(jedis.zrangeByScoreWithScores("zset-key", 2, 3));
}

 

   

 

 

 1 @Test
 2 public void test10() {
 3     Jedis jedis = new Jedis("localhost");
 4     // 生成有序集合
 5     jedis.zadd("zset2-key", new HashMap<String, Double>() {{
 6         put("a", 1d);
 7         put("b", 3d);
 8         put("c", 2d);
 9     }});
10     // 回傳有序集合中指定member的排名
11     System.out.println(jedis.zrevrank("zset2-key", "a"));
12     // 回傳有序集合給定排名范圍內的成員 分值降序
13     System.out.println(jedis.zrevrange("zset2-key", 0, jedis.zcard("zset-key")));
14     // 回傳有序集合中分值介于min和max之間的所有成員 并按照分值排序
15     System.out.println(jedis.zrangeByScore("zset2-key", 2, 3));
16     // 移除排名介于start和max之間所有成員 洗掉排名1-2之間的成員
17     jedis.zremrangeByRank("zset2-key", 1, 2);
18     // 查詢移除后的結果
19     System.out.println(jedis.zrevrange("zset2-key", 0, jedis.zcard("zset-key")));
20     jedis.zadd("zset2-key", new HashMap<String, Double>() {{
21         put("a", 1d);
22         put("b", 3d);
23         put("c", 2d);
24     }});
25     // 移除分值介于min和max之間所有成員
26     jedis.zremrangeByScore("zset2-key", 1, 2);
27     System.out.println(jedis.zrevrange("zset2-key", 0, jedis.zcard("zset-key")));
28 }

    交集和并集 Redis的交集運算:     將相同key的成員的分值相加,若某個成員是集合中獨有的,在合并后不存在;   Redis的并集運算:     將相同key的成員的分值相加,若某個成員是集合中獨有的,在合并后放置在新的集合中;
 1 @Test
 2 public void test11() {
 3     Jedis jedis = new Jedis("localhost");
 4     jedis.zadd("zset3-key", new HashMap<String, Double>() {{
 5         put("a", 1d);
 6         put("b", 4d);
 7         put("c", 2d);
 8     }});
 9     jedis.zadd("zset4-key", new HashMap<String, Double>() {{
10         put("a", 7d);
11         put("e", 3d);
12         put("f", 1d);
13     }});
14     // 對有序集合執行交集運算
15     jedis.zinterstore("zset5-key", "zset3-key", "zset4-key");
16     System.out.println(jedis.zrevrangeWithScores("zset5-key", 0, jedis.zcard("zset5-key")));
17     // 對有序集合執行并集運算
18     jedis.zunionstore("zset6-key", "zset3-key", "zset4-key");
19     System.out.println(jedis.zrevrangeWithScores("zset6-key", 0, jedis.zcard("zset6-key")));
20 }

 

 

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2473.html

標籤:NoSQL

上一篇:Redis入門(3) - 事務和快取

下一篇:mongodb服務掛了重啟日志報錯Out of memory

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more