Redis詳解

1、Redis簡介

1.關於關係型數據庫和nosql數據庫 關係型數據庫是基於關係表的數據庫,最終會將數據持久化到磁盤上,而nosql數據 庫是基於特殊的結構,並將數據存儲到內存的數據庫。從性能上而言,nosql數據庫 要優於關係型數據庫,從安全性上而言關係型數據庫要優於nosql數據庫,因此在實 際開發中一個項目中nosql和關係型數據庫會一塊兒使用,達到性能和安全性的雙保證。java

輸入圖片說明

2、使用java去操做Redis

1 maven配置文件redis

<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>
  <groupId>com.shi.redis</groupId>
  <artifactId>redis_first</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <dependencies>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
  	<!-- java redis jar包 -->
  	<dependency>
	    <groupId>redis.clients</groupId>
	    <artifactId>jedis</artifactId>
	    <version>2.7.0</version>
	</dependency>
	<!-- 連接遲 -->
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-pool2</artifactId>
	    <version>2.3</version>
	</dependency>
  </dependencies>
</project>

2 java代碼sql

package com.shi.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * redisPool的工具包
 * @author shiye
 *
 */
public class RedisPoolUtil {
	
	private static JedisPool jedisPool=null;
	
	//靜態代碼塊 初始化鏈接池(jedisPool)
	static{
		//加載配置文件
		InputStream is=RedisPoolUtil.class.getClassLoader().getResourceAsStream("redisPool.properties");
		Properties pp=new Properties();
		try {
			pp.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		JedisPoolConfig poolConfig=new JedisPoolConfig();
		poolConfig.setMaxIdle(Integer.parseInt(pp.getProperty("redis.maxIdle")));//設置最大閒置數量
		poolConfig.setMinIdle(Integer.parseInt(pp.getProperty("redis.minIdle")));//設置最小閒置數量
		poolConfig.setMaxTotal(Integer.parseInt(pp.getProperty("redis.maxTotal")));//設置最大連接數
		
		jedisPool=new JedisPool(poolConfig, pp.getProperty("redis.host"), Integer.parseInt(pp.getProperty("redis.port")));
	}
	
	
	//關閉資源 jedis
	public static void jedisClose(Jedis jedis){
		if(jedis!=null ){
			jedis.close();
		}
		System.out.println("jedis關閉");
	}
	//關閉鏈接池
	public static void poolClose(){
		if(!jedisPool.isClosed()){
			jedisPool.close();
			//System.out.println("***********");
		}
		
		System.out.println("pool關閉");
	}
	
	
	//測試工具是否可使用  ok
	public static void main(String[] args){
		Jedis jedis=jedisPool.getResource();
		System.out.println(jedis.get("username"));
		RedisPoolUtil.jedisClose(jedis);
		RedisPoolUtil.poolClose();
	}
	
}

3 redisPool.properties 的配置文件數據庫

redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=500
redis.host=127.0.0.1
redis.port=6379

3、Redis的經常使用命令

redis是一種高級的key-value的存儲系統 其中的key是字符串類型,儘量知足以下幾點: 1)key不要太長,最好不要操做1024個字節,這不只會消耗內存還會下降查找 效率 2)key不要過短,若是過短會下降key的可讀性 3)在項目中,key最好有一個統一的命名規範(根據企業的需求) 其中value 支持五種數據類型: 1)字符串型 string 2)字符串列表 lists 3)字符串集合 sets 4)有序字符串集合 sorted sets 5)哈希類型 hashsapache

咱們對Redis的學習,主要是對數據的存儲,下面未來學習各類Redis的數據類型的 存儲操做:安全

1.存儲字符串string 字符串類型是Redis中最爲基礎的數據存儲類型,它在Redis中是二進制安全的,這 便意味着該類型能夠接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。 在Redis中字符串類型的Value最多能夠容納的數據長度是512M服務器

輸入圖片說明

1)set key value:設定key持有指定的字符串value,若是該key存在則進行覆蓋 操做。老是返回」OK」網絡

2)get key:獲取key的value。若是與該key關聯的value不是String類型,redis 將返回錯誤信息,由於get命令只能用於獲取String value;若是該key不存在,返 回null。數據結構

輸入圖片說明

3)getset key value:先獲取該key的值,而後在設置該key的值。app

輸入圖片說明

4)incr key:將指定的key的value原子性的遞增1.若是該key不存在,其初始值 爲0,在incr以後其值爲1。若是value的值不能轉成整型,如hello,該操做將執 行失敗並返回相應的錯誤信息。

5)decr key:將指定的key的value原子性的遞減1.若是該key不存在,其初始值 爲0,在incr以後其值爲-1。若是value的值不能轉成整型,如hello,該操做將執 行失敗並返回相應的錯誤信息。

輸入圖片說明

6)incrby key increment:將指定的key的value原子性增長increment,若是該 key不存在,器初始值爲0,在incrby以後,該值爲increment。若是該值不能轉成 整型,如hello則失敗並返回錯誤信息

7)decrby key decrement:將指定的key的value原子性減小decrement,若是 該key不存在,器初始值爲0,在decrby以後,該值爲decrement。若是該值不能 轉成整型,如hello則失敗並返回錯誤信息

輸入圖片說明

8)append key value:若是該key存在,則在原有的value後追加該值;若是該 key 不存在,則從新建立一個key/value

輸入圖片說明

2.存儲lists類型 在Redis中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表 同樣,咱們能夠在其頭部(left)和尾部(right)添加新的元素。在插入時,若是該鍵並不 存在,Redis將爲該鍵建立一個新的鏈表。與此相反,若是鏈表中全部的元素均被移 除,那麼該鍵也將會被從數據庫中刪除。List中能夠包含的最大元素數量是 4294967295。

從元素插入和刪除的效率視角來看,若是咱們是在鏈表的兩頭插入或刪除元素,這將		會是很是高效的操做,即便鏈表中已經存儲了百萬條記錄,該操做也能夠在常量時間		內完成。然而須要說明的是,若是元素插入或刪除操做是做用於鏈表中間,那將會是		很是低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。

輸入圖片說明

1)lpush key value1 value2...:在指定的key所關聯的list的頭部插入全部的 values,若是該key不存在,該命令在插入的以前建立一個與該key關聯的空鏈 表,以後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。

2)rpush key value一、value2…:在該list的尾部添加元素

3)lrange key start end:獲取鏈表中從start到end的元素的值,start、end可 爲負數,若爲-1則表示鏈表尾部的元素,-2則表示倒數第二個,依次類推…

輸入圖片說明

4)lpushx key value:僅當參數中指定的key存在時(若是與key管理的list中沒 有值時,則該key是不存在的)在指定的key所關聯的list的頭部插入value。

5)rpushx key value:在該list的尾部添加元素

輸入圖片說明

6)lpop key:返回並彈出指定的key關聯的鏈表中的第一個元素,即頭部元素。

7)rpop key:從尾部彈出元素。

輸入圖片說明

8)rpoplpush resource destination:將鏈表中的尾部元素彈出並添加到頭部

輸入圖片說明

9)llen key:返回指定的key關聯的鏈表中的元素的數量。

輸入圖片說明

10)lset key index value:設置鏈表中的index的腳標的元素值,0表明鏈表的頭元 素,-1表明鏈表的尾元素。

輸入圖片說明

11)lrem key count value:刪除count個值爲value的元素,若是count大於0,從頭向尾遍歷並刪除count個值爲value的元素,若是count小於0,則從尾向頭遍歷並刪除。若是count等於0,則刪除鏈表中全部等於value的元素。

輸入圖片說明

12)linsert key before|after pivot value:在pivot元素前或者後插入value這個 元素。

輸入圖片說明

3.存儲sets類型 在Redis中,咱們能夠將Set類型看做爲沒有排序的字符集合,和List類型同樣,我 們也能夠在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操做。須要 說明的是,這些操做的時間是常量時間。Set可包含的最大元素數是4294967295。 和List類型不一樣的是,Set集合中不容許出現重複的元素。和List類型相比,Set類 型在功能上還存在着一個很是重要的特性,即在服務器端完成多個Sets之間的聚合計 算操做,如unions、intersections和differences。因爲這些操做均在服務端完成, 所以效率極高,並且也節省了大量的網絡IO開銷

1)sadd key value一、value2…:向set中添加數據

輸入圖片說明

1)sadd key value一、value2…:向set中添加數據,若是該key的值已有則不會 重複添加

2)smembers key:獲取set中全部的成員

3)scard key:獲取set中成員的數量

4)sismember key member:判斷參數中指定的成員是否在該set中,1表示存 在,0表示不存在或者該key自己就不存在

5)srem key member一、member2…:刪除set中指定的成員

6)srandmember key:隨機返回set中的一個成員

7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,並且與key的順序有 關。即返回差集。

8)sdiffstore destination key1 key2:將key一、key2相差的成員存儲在 destination上

9)sinter key[key1,key2…]:返回交集。

10)sinterstore destination key1 key2:將返回的交集存儲在destination上

11)sunion key一、key2:返回並集。

12)sunionstore destination key1 key2:將返回的並集存儲在destination上

4.存儲sortedset Sorted-Sets和Sets類型極爲類似,它們都是字符串的集合,都不容許重複的成員出 如今一個Set中。它們之間的主要差異是Sorted-Sets中的每個成員都會有一個分 數(score)與之關聯,Redis正是經過分數來爲集合中的成員進行從小到大的排序。然 而須要額外指出的是,儘管Sorted-Sets中的成員必須是惟一的,可是分數(score) 倒是能夠重複的。

在Sorted-Set中添加、刪除或更新一個成員都是很是快速的操做,其時間複雜度爲 集合中成員數量的對數。因爲Sorted-Sets中的成員在集合中的位置是有序的,所以, 即使是訪問位於集合中部的成員也仍然是很是高效的。事實上,Redis所具備的這一 特徵在不少其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis 一樣的高效,在其它數據庫中進行建模是很是困難的。

例如:遊戲排名、微博熱點話題等使用場景。

輸入圖片說明

1)zadd key score member score2 member2 … :將全部成員以及該成員的 分數存放到sorted-set中

2)zcard key:獲取集合中的成員數量

3)zcount key min max:獲取分數在[min,max]之間的成員

zincrby key increment member:設置指定成員的增長的分數。

zrange key start end [withscores]:獲取集合中腳標爲start-end的成員,[withscores]參數代表返回的成員包含其分數。

zrangebyscore key min max [withscores] [limit offset count]:返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]:offset,代表從腳標爲offset的元素開始並返回count個成員。

zrank key member:返回成員在集合中的位置。

zrem key member[member…]:移除集合中指定的成員,能夠指定多個成員。

zscore key member:返回指定成員的分數

5.存儲hash Redis中的Hashes類型能夠當作具備String Key和String Value的map容器。所 以該類型很是適合於存儲值對象的信息。如Username、Password和Age等。若是 Hash中包含不多的字段,那麼該類型的數據也將僅佔用不多的磁盤空間。每個Hash 能夠存儲4294967295個鍵值對。

輸入圖片說明

1)hset key field value:爲指定的key設定field/value對(鍵值對)。

2)hgetall key:獲取key中的全部filed-vaule

3)hget key field:返回指定的key中的field的值

4)hmset key fields:設置key中的多個filed/value

5)hmget key fileds:獲取key中的多個filed的值

6)hexists key field:判斷指定的key中的filed是否存在

7)hlen key:獲取key所包含的field的數量

8)hincrby key field increment:設置key中filed的值增長increment,如:age 增長20

3.4. Key命令

設置key的過時時間。

Expire key second:設置key的過時時間

Ttl key:查看key的有效期

Persist key:清除key的過時時間。Key持久化。

192.168.25.153:6379> expire Hello 100

(integer) 1

192.168.25.153:6379> ttl Hello

(integer) 77

  1. Redis的持久化方案

Redis的全部數據都是保存到內存中的。

Rdb:快照形式,按期把內存中當前時刻的數據保存到磁盤。Redis默認支持的持久化方案。

aof形式:append only file。把全部對redis數據庫操做的命令,增刪改操做的命令。保存到文件中。數據庫恢復時把全部的命令執行一遍便可。

在redis.conf配置文件中配置。 Rdb:

相關文章
相關標籤/搜索