日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例

發布時間:2024/7/5 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習目標

  • redis
  • 概念
  • 下載安裝
  • 命令操作
    1. 數據結構
  • 持久化操作
  • 使用Java客戶端操作redis
  • Redis

    前言(從百度上抄的, 看看了解一下, 懶得排版了)

    1. 概念: redis是一款高性能的NOSQL系列的非關系型數據庫1.1.什么是NOSQLNoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項全新的數據庫理念,泛指非關系型的數據庫。隨著互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高并發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。1.1.1. NOSQL和關系型數據庫比較優點:1)成本:nosql數據庫簡單易部署,基本都是開源軟件,不需要像使用oracle那樣花費大量成本購買使用,相比關系型數據庫價格便宜。2)查詢速度:nosql數據庫將數據存儲于緩存之中,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及nosql數據庫。3)存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型。4)擴展性:關系型數據庫有類似join這樣的多表查詢機制的限制導致擴展很艱難。缺點:1)維護的工具和資料有限,因為nosql是屬于新的技術,不能和關系型數據庫10幾年的技術同日而語。2)不提供對sql的支持,如果不支持sql這樣的工業標準,將產生一定用戶的學習和使用成本。3)不提供關系型數據庫對事務的處理。1.1.2. 非關系型數據庫的優勢:1)性能NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,所以性能非常高。2)可擴展性同樣也是因為基于鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。1.1.3. 關系型數據庫的優勢:1)復雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常復雜的數據查詢。2)事務支持使得對于安全性能很高的數據訪問要求得以實現。對于這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。1.1.4. 總結關系型數據庫與NoSQL數據庫并非對立而是互補的關系即通常情況下使用關系型數據庫,在適合使用NoSQL的時候使用NoSQL數據庫,讓NoSQL數據庫對關系型數據庫的不足進行彌補。一般會將數據存儲在關系型數據庫中,在nosql數據庫中備份存儲關系型數據庫的數據1.2.主流的NOSQL產品? 鍵值(Key-Value)存儲數據庫相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB典型應用: 內容緩存,主要用于處理大量數據的高訪問負載。 數據模型: 一系列鍵值對優勢: 快速查詢劣勢: 存儲的數據缺少結構化? 列存儲數據庫相關產品:Cassandra, HBase, Riak典型應用:分布式的文件系統數據模型:以列簇式存儲,將同一列數據存在一起優勢:查找速度快,可擴展性強,更容易進行分布式擴展劣勢:功能相對局限? 文檔型數據庫相關產品:CouchDB、MongoDB典型應用:Web應用(與Key-Value類似,Value是結構化的)數據模型: 一系列鍵值對優勢:數據結構要求不嚴格劣勢: 查詢性能不高,而且缺乏統一的查詢語法? 圖形(Graph)數據庫相關數據庫:Neo4J、InfoGrid、Infinite Graph典型應用:社交網絡數據模型:圖結構優勢:利用圖結構相關算法。劣勢:需要對整個圖做計算才能得出結果,不容易做分布式的集群方案。

    什么是Redis

    概述

    Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,官方提供測試數據,50個并發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需

    • 目前為止Redis支持的鍵值數據類型如下:
  • 字符串類型 string
  • 哈希類型 hash
  • 列表類型 list
  • 集合類型 set
  • 有序集合類型 sortedset
    • redis的應用場景
      ? 緩存(數據查詢、短連接、新聞內容、商品內容等等)
      ? 聊天室的在線好友列表
      ? 任務隊列。(秒殺、搶購、12306等等)
      ? 應用排行榜
      ? 網站訪問統計
      ? 數據過期處理(可以精確到毫秒
      ? 分布式集群架構中的session分離
    • 下載安裝
      1. 官網(國外網站網速不友好)
      2. 國內中文網
      3. 下載綠色壓縮包就可以解壓直接可以使用:
      4. redis目錄結構如下:

      * redis.windows.conf:配置文件
      * redis-cli.exe:redis的客戶端
      * redis-server.exe:redis服務器端
      * 另外幾個使用來對redis進行配置優化操作(就不提了)
      * 注: redis默認的端口是6379, 可以使用conf進行修改

    使用命令對redis的數據進行增刪改查

    • redis的數據結構:
      redis存儲的是:key,value格式的數據,其中key都是字符串,value有5種不同的數據結構.
      value的數據結構:
    • 字符串類型: string(一個key只能對應一個String)
    • 哈希類型 hash : map格式(一個key可以對應多個map)
    • 列表類型 list : linkedlist格式(類似于管道, 一個key對應一個管道, 一個管道中可以多個數據, 因此一個key可以對應多個list)。支持重復元素
    • 集合類型 set : ()不允許重復元素
    • 有序集合類型 sortedset:不允許重復元素,且元素有順序
      注: 不要把key與value搞混, 特別是哈希類型, 針對hash類型, 就記住一個大map中存一個小map
    • 使用命令操作redis數據進行增刪改查:
    • 字符串類型 string
      存儲: set key value
      127.0.0.1:6379> set username zhangsan
      運行結果: OK

      • 獲取: get key
        127.0.0.1:6379> get username
        運行結果: “zhangsan”
      • 刪除: del key
        127.0.0.1:6379> del age
        運行結果: (integer) 1 //表示對數據的操作個數
    • 哈希類型 hash

      • 存儲: hset key field value
        127.0.0.1:6379> hset myhash username lisi
        運行結果: (integer) 1
        127.0.0.1:6379> hset myhash password 123
        運行結果: (integer) 1

      • 獲取:

        • hget key field: 獲取指定的field對應的值
          127.0.0.1:6379> hget myhash username
          “lisi”
        • hgetall key:獲取所有的field和value
          127.0.0.1:6379> hgetall myhash
        運行結果: "username" "lisi" "password" "123"
      • 刪除: hdel key field
        127.0.0.1:6379> hdel myhash username
        (integer) 1

      • 列表類型 list:可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)

        • 添加:
          push key value: 將元素加入列表左表
          rpush key value:將元素加入列表右邊
          127.0.0.1:6379> lpush myList a
          運行結果: (integer) 1
          127.0.0.1:6379> lpush myList b
          運行結果: (integer) 2
          127.0.0.1:6379> rpush myList c
          運行結果: (integer) 3
        • 獲取:
          • lrange key start end :范圍獲取
            127.0.0.1:6379> lrange myList 0 -1
            運行結果:
            “b”
            “a”
            “c”
        • 刪除:
          • lpop key: 刪除列表最左邊的元素,并將元素返回
          • rpop key: 刪除列表最右邊的元素,并將元素返回
    • 集合類型 set : 不允許重復元素

      • 存儲:sadd key value
        127.0.0.1:6379> sadd myset a
        (integer) 1
        127.0.0.1:6379> sadd myset a
        (integer) 0
      • 獲取:smembers key:獲取set集合中所有元素
        127.0.0.1:6379> smembers myset
        運行結果: “a”
      • 刪除:srem key value:刪除set集合中的某個元素
        127.0.0.1:6379> srem myset a
        (integer) 1
    • 有序集合類型 sortedset:不允許重復元素,且元素有順序.每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

      • 存儲:zadd key score value
        127.0.0.1:6379> zadd mysort 60 zhangsan
        (integer) 1
        127.0.0.1:6379> zadd mysort 50 lisi
        (integer) 1
        127.0.0.1:6379> zadd mysort 80 wangwu
        (integer) 1
      • 獲取:zrange key start end [withscores]
        • 127.0.0.1:6379> zrange mysort 0 -1
          運行結果:
          “lisi”
          “zhangsan”
          “wangwu”
        • 127.0.0.1:6379> zrange mysort 0 -1 withscores
          運行結果:
          “zhangsan”
          “60”
          “wangwu”
          “80”
          “lisi”
          “500”
      • 刪除:zrem key value
        127.0.0.1:6379> zrem mysort lisi
        (integer) 1
    • 通用命令

      • keys * : 查詢所有的鍵
      • type key : 獲取鍵對應的value的類型
      • del key:刪除指定的key value

    注: 在redis中, 沒有明確的修改數據的命令, 如果需要修改數據, 可以添加新的數據對原來的數據進行覆蓋, 或者直接刪除, 重新添加

    持久化

    redis是一個內存數據庫,當redis服務器重啟,獲取電腦重啟,數據會丟失,我們可以將redis內存中的數據持久化保存到硬盤的文件中。

    • redis持久化機制:
      • RDB:默認方式,不需要進行配置,默認就使用這種機制, redis在一定的間隔時間中,檢測key的變化情況,然后持久化數據

      • 操作步驟如下:

      • 編輯redis.windwos.conf文件
        # after 900 sec (15 min) if at least 1 key changed
        save 900 1
        # after 300 sec (5 min) if at least 10 keys changed
        save 300 10
        # after 60 sec if at least 10000 keys changed
        save 60 10000
      • 重新啟動redis服務器,并指定配置文件名稱
        D:\JavaWeb2018\day23_redis\資料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf
      • AOF:日志記錄的方式,可以記錄每一條命令的操作。可以每一次命令操作后,持久化數據

      • 操作步驟如下:

      • 編輯redis.windwos.conf文件
        appendonly no(關閉aof, 默認值) --> appendonly yes (開啟aof)
        # appendfsync always : 每一次操作都進行持久化
        appendfsync everysec : 每隔一秒進行一次持久化
        # appendfsync no : 不進行持久化
      • 重新啟動redis服務器, 并指定配置文件名稱(這步操作與RDB操作的第二步一樣)

    Java使用Jedis連接redis進行數據操作

    Java客戶端 Jedis

    • Jedis: 一款java操作redis數據庫的工具.
    • 使用maven導入Jedis的jar包
    • 使用
    //1. 獲取連接Jedis jedis = new Jedis("localhost",6379);//2. 操作jedis.set("username","zhangsan");//3. 關閉連接jedis.close();
    • Jedis操作各種redis中的數據結構(Jedis中大多數方法名都是和redis的命令一樣的, 在使用上具有很大的便利)
  • 字符串類型 string
    set, get方法
  • //1. 獲取連接Jedis jedis = new Jedis();//如果使用空參構造,默認值 "localhost",6379端口//2. 操作//存儲jedis.set("username","zhangsan");//獲取String username = jedis.get("username");System.out.println(username);//可以使用setex()方法存儲可以指定過期時間的 key value//將activecode:hehe鍵值對存入redis,并且20秒后自動刪除該鍵值對jedis.setex("activecode",20,"hehe");//3. 關閉連接jedis.close();
  • 哈希類型 hash : map格式 , hset, hget, hgetAll 函數
  • //1. 獲取連接Jedis jedis = new Jedis();//如果使用空參構造,默認值 "localhost",6379端口//2. 操作// 存儲hashjedis.hset("user","name","lisi");jedis.hset("user","age","23");jedis.hset("user","gender","female");// 獲取hashString name = jedis.hget("user", "name");System.out.println(name);// 獲取hash的所有map中的數據Map<String, String> user = jedis.hgetAll("user");// keysetSet<String> keySet = user.keySet();for (String key : keySet) {//獲取valueString value = user.get(key);System.out.println(key + ":" + value);}//3. 關閉連接jedis.close();
  • 列表類型 list : linkedlist格式。支持重復元素
    lpush / rpush
    lpop / rpop
    lrange start end : 范圍獲取
  • //1. 獲取連接Jedis jedis = new Jedis();//如果使用空參構造,默認值 "localhost",6379端口//2. 操作// list 存儲jedis.lpush("mylist","a","b","c");//從左邊存jedis.rpush("mylist","a","b","c");//從右邊存// list 范圍獲取List<String> mylist = jedis.lrange("mylist", 0, -1);System.out.println(mylist);// list 彈出String element1 = jedis.lpop("mylist");//cSystem.out.println(element1);String element2 = jedis.rpop("mylist");//cSystem.out.println(element2);// list 范圍獲取List<String> mylist2 = jedis.lrange("mylist", 0, -1);System.out.println(mylist2);//3. 關閉連接jedis.close();
  • 集合類型 set : 不允許重復元素
    sadd
    smembers:獲取所有元素
  • //1. 獲取連接Jedis jedis = new Jedis();//如果使用空參構造,默認值 "localhost",6379端口//2. 操作// set 存儲jedis.sadd("myset","java","php","c++");// set 獲取Set<String> myset = jedis.smembers("myset");System.out.println(myset);//3. 關閉連接jedis.close();
  • 有序集合類型 sortedset:不允許重復元素,且元素有順序
    zadd
    zrange
  • //1. 獲取連接Jedis jedis = new Jedis();//如果使用空參構造,默認值 "localhost",6379端口//2. 操作// sortedset 存儲jedis.zadd("mysortedset",3,"亞瑟");jedis.zadd("mysortedset",30,"后裔");jedis.zadd("mysortedset",55,"孫悟空");// sortedset 獲取Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);System.out.println(mysortedset);//3. 關閉連接jedis.close();
    • jedis連接池: JedisPool
      • 使用:
      • 創建JedisPool連接池對象
      • 調用方法 getResource()方法獲取Jedis連接
    //0.創建一個配置對象JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(50);config.setMaxIdle(10);//1.創建Jedis連接池對象JedisPool jedisPool = new JedisPool(config,"localhost",6379);//2.獲取連接Jedis jedis = jedisPool.getResource();//3. 使用jedis.set("hehe","heihei");//4. 關閉 歸還到連接池中jedis.close();
    • 連接池工具類
    public class JedisPoolUtils {private static JedisPool jedisPool;static{//讀取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//創建Properties對象Properties pro = new Properties();//關聯文件try {pro.load(is);} catch (IOException e) {e.printStackTrace();}//獲取數據,設置到JedisPoolConfig中JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));//初始化JedisPooljedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));}/*** 獲取連接方法*/public static Jedis getJedis(){return jedisPool.getResource();} }

    在Service層使用redis進行數據緩存

    下面就只給出Service層的代碼, 單純說明redis:
    代碼流程:

  • 第一次數據查詢, 先看看redis中是否有緩存數據, 沒有就先去mysql數據庫中查找.
  • 將1中mysql查詢的數據轉化為Json格式存入redis中.
  • 第二次數據查詢, 就到redis中進行查找.
  • 在恰當的時候使用持久化操作
  • Service層數據

    package com.regotto.service.impl;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.regotto.dao.ProvinceDao; import com.regotto.dao.impl.ProvinceDaoImpl; import com.regotto.domain.Province; import com.regotto.service.ProvinceService; import com.regotto.utils.JedisUtils; import redis.clients.jedis.Jedis;import java.util.List;/*** 服務層調用dao層進行查詢操作* @author regotto*/ public class ProvinceServiceImpl implements ProvinceService {private ProvinceDao provinceDao = new ProvinceDaoImpl();//進行查詢操作@Overridepublic List<Province> findAll() {return provinceDao.findAll();}@Overridepublic String findAllJson() {//使用前面定義的工具類Jedis jedis = JedisUtils.getJedisPool();String provinceJson = jedis.get("province");if (provinceJson == null || provinceJson.length() == 0) {System.out.println("redis 中沒有數據, 查詢數據庫");//redis中沒有數據, 就使用mysql的查詢操作進行數據查詢List<Province> provinceList = provinceDao.findAll();ObjectMapper objectMapper = new ObjectMapper();try {provinceJson = objectMapper.writeValueAsString(provinceList);jedis.set("province", provinceJson);} catch (JsonProcessingException e) {e.printStackTrace();}} else {System.out.println("redis 中存在數據");}return provinceJson;}}

    Servlet代碼

    package com.regotto.web;import com.fasterxml.jackson.databind.ObjectMapper; import com.regotto.domain.Province; import com.regotto.service.ProvinceService; import com.regotto.service.impl.ProvinceServiceImpl;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List;public class ProvinceServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//執行service層方法//List<Province> provinceList = new ProvinceServiceImpl().findAll();//將provinceList數據序列化為json數據 // ObjectMapper objectMapper = new ObjectMapper(); // String json = objectMapper.writeValueAsString(provinceList);//使用redis做緩存改進String json = new ProvinceServiceImpl().findAllJson();System.out.println(json);//響應結果response.setContentType("application/json;charset=utf-8");response.getWriter().println(json);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);} }

    總結

    • 注意:使用redis緩存一些不經常發生變化的數據。
    • 數據庫的數據一旦發生改變,則需要更新緩存。
    • 數據庫的表執行 增刪改的相關操作,需要將redis緩存數據情況,再次存入
    • 在service對應的增刪改方法中,將redis數據刪除。

    總結

    以上是生活随笔為你收集整理的Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。