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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

note.. redis五大数据类型

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 note.. redis五大数据类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

redis 五大數(shù)據(jù)類型使用

    • nosql介紹,由來
    • 什么是nosql
    • 阿里巴巴的架構(gòu)
    • nosql 四大分類
    • redis入門
      • 概述
      • redis 安裝 (docker)
      • 基礎(chǔ)的知識
    • redis五大數(shù)據(jù)類型
      • Redis-Key
      • String
      • List (列表)
      • Set (集合)
      • Hash(哈希)
      • Zset 有序集合

nosql介紹,由來

1. 單機(jī)mysql~ 數(shù)據(jù)量太大,一個機(jī)器放不下~ 數(shù)據(jù)的索引(B+ tree) 一個機(jī)器的內(nèi)存也放不下~ 訪問量(讀寫混合) 一個服務(wù)器承受不了讀寫分離(垂直拆分),讀是很多的,1號myql被讀了,下個用戶又來讀。 2. memcached(緩存) + mysql + 垂直拆分 網(wǎng)站80%都是在讀,每次都要查詢數(shù)據(jù)庫十分麻煩,為例減輕服務(wù)器的壓力,使用緩存來保證效率。發(fā)展過程:優(yōu)化數(shù)據(jù)結(jié)果和索引--> 文件緩存(io) -->memcached(當(dāng)時火熱的技術(shù))3. 分庫分表 水平拆分 mysql集群 技術(shù)和業(yè)務(wù)在發(fā)展的同時,對人的要求也越來越高。 本質(zhì):讀,寫 早年myisam:表鎖,整個表鎖住 轉(zhuǎn)戰(zhàn)innodb:行鎖 so.. 使用分庫分表的方式解決寫的壓力, 表分區(qū)。 user --> 拆分. mysql集群,滿足當(dāng)時的需求4. 最近的年代 技術(shù)爆炸: 2010-2020 (定位, 音樂,熱榜) mysql 已經(jīng)滿足不了需求了。數(shù)據(jù)多,變化快。 mysql 有的使用它來存儲一些比較大的文件,博客,圖片。數(shù)據(jù)庫表很大,效率就低了。使用redis,nosql可處理這種數(shù)據(jù)。 mysql 壓力就變得十分小(如何處理) 大數(shù)據(jù)io的壓力下,表幾乎沒法更改。5 為什么要使用nosql?用戶的個人信息,社交網(wǎng)絡(luò),地理位置。 用戶自己產(chǎn)生的數(shù)據(jù),用戶日志等 爆發(fā)式增長。 需要nosql來解決~

什么是nosql

nosql = not only sql

關(guān)系型數(shù)據(jù)庫:表格,行,列

泛指非關(guān)系型數(shù)據(jù)庫的,web2.0, 傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難對付web2.0時代,尤其是超大規(guī)模的高并發(fā)社區(qū)。暴露出來很多難以客服的問題,nosql在當(dāng)今大數(shù)據(jù)環(huán)境下發(fā)展迅速,redis是發(fā)展最快的。

很多的數(shù)據(jù)類型,用戶的個人信息,社交網(wǎng)絡(luò),地理位置。這些數(shù)據(jù)類型的存儲不需要一個固定的格式。是可橫向擴(kuò)展的。Map<String, Object>, kv control.

nosql 特點

1、方便擴(kuò)展(數(shù)據(jù)直接沒有關(guān)系,很好擴(kuò)展)

2、大數(shù)據(jù)量高性能(redis 1s寫8萬次,1s讀取11萬次,nosql的緩存記錄級,細(xì)粒度,性能高)

3、數(shù)據(jù)類型多樣。8 無需設(shè)計數(shù)據(jù)庫。

4、傳統(tǒng)rdbms和nosql

rdbms (非關(guān)系型數(shù)據(jù)庫) - 結(jié)構(gòu)化阻止 - sql - 數(shù)據(jù)和關(guān)系存在單獨的表中 - 數(shù)據(jù)操作,數(shù)據(jù)定義語言 - 嚴(yán)格的一致性 - 基礎(chǔ)的事務(wù) acid ,,,

阿里巴巴的架構(gòu)

架構(gòu)師:沒有什么是加一層解決不了的。

1. 商品的基本信息名稱,價格,商家信息關(guān)系型數(shù)據(jù)庫高i的搞定。 mysql/oracle (taobao 去ioe,王堅 阿里云的這群瘋子)2. 商品的描述,評論(文字多)文檔型數(shù)據(jù)庫,mogodb3. 圖片分布式文件系統(tǒng) fastdfs淘寶 tfsgoogle gfshadoop hdfsaliyun oss4. 商品的關(guān)鍵字(搜索)搜索引擎 solr, elasticsearchisearch 多隆5 商品的波段信息內(nèi)存數(shù)據(jù)庫redis tair memache6. 商品的交易,外部的支付接口

問題:

  • 數(shù)據(jù)類型太多了
  • 數(shù)據(jù)源繁多,經(jīng)常重構(gòu)
  • 數(shù)據(jù)要改造,大面積改造

解決:

? udsl, 數(shù)據(jù)服務(wù)層

nosql - 不僅僅是數(shù)據(jù) - 沒有固定的查詢語言 - 鍵值對存儲,列存儲,文檔存儲,圖形數(shù)據(jù)庫(社交關(guān)系) - 最終一致性 - cap定理 和 base (異地多活) - 性能,可用,可擴(kuò) ...

nosql 四大分類

kv鍵值對:

  • 新浪 redis
  • meituan: redis + tair
  • ali,baidu redis + memecache

文檔型數(shù)據(jù)庫

  • mogodb 掌握
    • 是基于分布式文件存儲的數(shù)據(jù)庫,c++編寫,主要處理大量的文檔
    • 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)中間的產(chǎn)品。它是非關(guān)系型數(shù)據(jù)庫中功能最豐富,最像關(guān)系型數(shù)據(jù)庫的。
  • conthDB

列存儲數(shù)據(jù)庫

  • hbase
  • 分布式文件系統(tǒng)oss

圖關(guān)系數(shù)據(jù)庫

  • 不是存圖形,放的是關(guān)系。比如,朋友圈設(shè)計網(wǎng)絡(luò),廣告推薦
  • neo4j, infoGrid;

redis入門

概述

redis 遠(yuǎn)程字典服務(wù) Remote Dictionary Server1. 是什么 是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。free, open-source, 是當(dāng)下最熱門的nosql技術(shù)之一,也被人們稱之為結(jié)構(gòu)化數(shù)據(jù)庫。2.能干嗎 - 內(nèi)存存儲,持久化,內(nèi)存中是斷電即失,所以說持久化很重要(rdb, aof) - 效率高,可用告訴緩存 - 發(fā)布訂閱系統(tǒng) - 地圖信息分析 - 計時器,計數(shù)器(瀏覽量) ...3. 特性 - 多樣的數(shù)據(jù)類型 - 持久化 - 集群 - 事務(wù) ...4. 文檔redis.io redis.cn

redis 安裝 (docker)

docker 容器/usr/local/bin 配置文件

docker pull redis:6.0.9docker run -d -p 6379:6379 --name myredis redis:6.0.9docker exec -it myredis /bin/bash

啟動鏡像時需要手動指定配置文件。我這沒指定。

基礎(chǔ)的知識

- redis有16個數(shù)據(jù)庫- 切換數(shù)據(jù)庫 select 1- 查看數(shù)據(jù)庫大小 DBSIZE- 清除當(dāng)前的數(shù)據(jù)庫 flushdb- 查看所有的鍵 keys *- 清空所有的數(shù)據(jù) FLUSHALLREDIS 是單線程的! redis是很快的!官方表示, redis是基于內(nèi)存操作的,cpu不是redis性能瓶頸,redis的性能是由機(jī)器的內(nèi)存和網(wǎng)絡(luò)帶寬決定的。redis是由c語言編寫的,官方數(shù)據(jù)為100000+的qps,不比memeCache差。redis為什么單線程很快?誤區(qū)1: 高性能的服務(wù)器一定是多線程的。。 誤區(qū)2: 多線程(cpu上下文切換)一定比單線程效率高。cpu 內(nèi)存 硬盤的速度核心:redis將所有的數(shù)據(jù)放到內(nèi)存里面的。使用單線程去操作效率就是高。多線程切換耗時。 對于內(nèi)存系統(tǒng)來說,如果沒有上下文切換,效率就是最高的。多次讀寫都是在一個cpu上的。

redis五大數(shù)據(jù)類型

# 官網(wǎng)簡介:used as a database, cache, and message broker.Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.

Redis-Key

# 1 true, 0 false exists some_keymove some_key# made smoe key 10 second ---> 單點登錄,熱點記錄 expire name 10# see the time when expire ttl name# see the type of key type key

https://redis.io/commands

String

# string demo set key1 v1 get key1 keys *exists key1# stringBuffer 不存在就創(chuàng)建key append key1 "hello"# remove move key1 0 # 0為下標(biāo)# get length of string strlen key1####################################set views 1 # increase the value 1 incr viewsincr views # -1 decr views# + 10 步長 incrby views 10# -10 decrby views 10######################### # 字符串截取 getRange key 0 3 # [0, 3]getRange key 0 -1 # get key # 字符串替換, 替換指定位置的字符串 setRange key offset value## demo get key1 "aaadorable, here" 127.0.0.1:6379[1]> SETRANGE key1 0 bb (integer) 16 127.0.0.1:6379[1]> get key1 "bbadorable, here" 127.0.0.1:6379[1]> SETRANGE key1 0 bbb # 往后覆蓋。。 (integer) 16 127.0.0.1:6379[1]> get key1 "bbbdorable, here" 127.0.0.1:6379[1]>########################### # setex (set with expire) # 設(shè)置過期時間 # setnx (set if not exist) # 不存在就設(shè)置 (分布式鎖中會常用)setex key 30 'hello' # 設(shè)置key 值為hello存在30妙ttl keysetnx key1 'adorable' # 不存在就設(shè)置,存在的話,設(shè)置不了,能保證數(shù)據(jù)不被覆蓋。###################### # 同時設(shè)置或者獲取多個值 # mset k1 v1 k2 v2 # mget k1 k2# 原子性 不存在就設(shè)置,多個鍵 set k1 v1 # 下面的都不會成功,k1存在了 msetnx k1 v1 k2 v2# 對象 bastard 有錯誤。。 TODO: .... bullshit set user:1 {name:jj, age:3} # 設(shè)置一個user:1# user:{id}:{filed} value ---->user后面可以多層套娃 mset user:1:name zhangshan user:1:age 18# 獲取值 mget user:1:name user:1:age# demo 127.0.0.1:6379[1]> mset user:1:name adorable user:1:age 19 OK 127.0.0.1:6379[1]> keys * 3) "user:1:age" 4) "user:1:name" 127.0.0.1:6379[1]> mget user:1:name user:1:age 1) "adorable" 2) "19" 127.0.0.1:6379[1]>############################## getset # 先get然后在set# 如果存在值,獲取原來的值,并設(shè)置新值 getset db redis # 不存在,則返回nullgetset db hhhh # 獲取到redis這個值然后再設(shè)置成hhhhstring類型的使用場景:value可是字符串或者數(shù)字 - 計數(shù)器 - 統(tǒng)計多單位的數(shù)量 - 粉絲數(shù) - 對象緩存存儲

List (列表)

redis 棧(頭),隊列(頭,尾),阻塞隊列

所有的list命令都是以l開頭的。

## base opration# left push lpush list onelpush list twolpush list threelrange list 0 -1 'three', 'two', 'one'lrange list 0 1 # 獲取頭部 three# right push 插入到右邊 rpush list right# 移除左邊的第一個 (first) lpop # 移除右邊的第一個 (last) rpop# 通過下標(biāo)獲取值 lindex someKey index lindex somekey 0# list長度 Llen someKey# 移除list集合中指定的值 lrem key count value######################### # list的截取操作 ltrim mylist 1 2 # 根據(jù)下標(biāo)截取~ mylist只剩下被截取的元素######################### # rpoplpush # 移除一個元素并添加到新的list中 rpush mylist "value1" rpush mylist "value2" rpush mylist "value3"# 將value3 添加到newlist rpoplpush mylist newlist######################### # 判斷l(xiāng)ist中是否存在值 exists list# 根據(jù)index 更新值 # 不存在列表報錯,無此index下標(biāo)越界 lset list 0 item############################ # linsert linsert mylist before/after "originValue" currentValue

小總結(jié):

  • 實際上是一個鏈表,before node after, left right to insert

  • 如果key不存在,創(chuàng)建

  • key存在,新增內(nèi)容

  • 如果移除了所有值,空鏈表,也代表不存在~

  • 再兩邊插入或者改動值,效率最高!中間元素,相對來說,效率會第一點。

消息排隊。消息隊列(Lpush, Rpop) , 棧(Lpush Lpop) .

Set (集合)

########################## # set sth~ s sadd myset 'hello' sadd myset 'world' sadd myset 'adorable'# 查看set集合中的內(nèi)容 smembers myset# 判斷set集合中的值是否存在, 存在返回1, 不存在返回0 sismembers myset hello# 獲取myset中的元素個數(shù) scard myset# 移除指定的元素值 srem myset 'hhh'################################## set 無序不重復(fù)集合。抽隨機(jī)。# 隨機(jī)抽選一個元素 SRANDMEMBER myset (count)# 隨機(jī)刪除元素 spop myset (count)################################### 將一個指定的值移動到另外一個集合中 127.0.0.1:6379[1]> sadd myset cc (integer) 1 127.0.0.1:6379[1]> smembers myset 1) "hh" 2) "bb" 3) "aa" 4) "cc" 127.0.0.1:6379[1]> sadd myset1 hello (integer) 1 127.0.0.1:6379[1]> smove myset myset1 cc (integer) 1 127.0.0.1:6379[1]> smembers myset 1) "hh" 2) "bb" 3) "aa" 127.0.0.1:6379[1]> smembers myset1 1) "cc" 2) "hello"# 哈哈哈 weibo,b站共同關(guān)注的.. # set的差集sdiff,交集sinter,并集sunion127.0.0.1:6379[1]> SMEMBERS myset1 1) "cc" 2) "hello" 127.0.0.1:6379[1]> SMEMBERS myset 1) "hh" 2) "bb" 3) "aa" 4) "cc" 127.0.0.1:6379[1]> sdiff myset1 myset # 以myset1為參照 1) "hello" 127.0.0.1:6379[1]> sinter myset1 myset # 交集 1) "cc" 127.0.0.1:6379[1]> sunion myset1 myset # 并集 1) "bb" 2) "hh" 3) "hello" 4) "aa" 5) "cc"

set的應(yīng)用:

微博,a用戶將所有關(guān)注的人放在一個set集合中。將其粉絲也放在一個集合中。

共同關(guān)注,共同愛好,二度好友,推薦好友…

Hash(哈希)

map集合。key-map 值是map集合。

set myhash field

# base garam # set myhash field value127.0.0.1:6379[1]> hset myhash name 'bitqian' age 19 # 同時設(shè)置多個值 (integer) 2 127.0.0.1:6379[1]> hget myhash name # 獲取單個值 "bitqian" 127.0.0.1:6379[1]> hget myhash age "19" 127.0.0.1:6379[1]> hgetall myhash # 獲取所有 1) "name" 2) "bitqian" 3) "age" 4) "19" 127.0.0.1:6379[1]> hmget myhash name age # 批量獲取 1) "bitqian" 2) "19"# 刪除hash中指定的鍵, 刪除后value也消失了。 hdel myhash age# 獲取長度 hlen myhash# 查看哈希中的某個鍵是否存在 hexists myhas name# 獲取所有的keys, vals hkeys myhash hvals myhas # 類型string操作。 值新增 或者 不存在才新增 hincrBy hsetnx

小總結(jié):

  • hash存儲變更的數(shù)據(jù) user, name, age,尤其存儲用戶信息之類的。經(jīng)常變動的信息。hash更適合于對象的存儲,string更適合字符串存儲。

Zset 有序集合

在set的基礎(chǔ)上增加了一個值。鍵是有序的。

# 新增操作127.0.0.1:6379[1]> zadd myzset 1 one (integer) 1 127.0.0.1:6379[1]> zadd myzset 2 two (integer) 1 127.0.0.1:6379[1]> zadd myzset 3 three (integer) 1 127.0.0.1:6379[1]> zrange myzset 0 -1 1) "one" 2) "two" 3) "three"# 排序如何實現(xiàn)# 新增三個人 127.0.0.1:6379[1]> zadd salary 6000 xiaoMing (integer) 1 127.0.0.1:6379[1]> zadd salary 9000 jack (integer) 1 127.0.0.1:6379[1]> zadd salary 5000 rose (integer) 1 # 按薪資從小到大排序 127.0.0.1:6379[1]> zrangebyscore salary -inf +inf 1) "rose" 2) "xiaoMing" 3) "jack"# 顯示用戶和薪資 127.0.0.1:6379[1]> zrangebyscore salary -inf +inf withscores 1) "rose" 2) "5000" 3) "xiaoMing" 4) "6000" 5) "jack" 6) "9000"# 薪水小于8000的 127.0.0.1:6379[1]> zrangebyscore salary -inf 8000 withscores 1) "rose" 2) "5000" 3) "xiaoMing" 4) "6000"### 上面都是升序。# zreverange# 降序 value 127.0.0.1:6379[1]> ZREVRANGE salary 0 -1 1) "jack" 2) "xiaoMing" 3) "rose" # 降序 127.0.0.1:6379[1]> ZREVRANGEBYSCORE salary +inf -inf withscores 1) "jack" 2) "9000" 3) "xiaoMing" 4) "6000" 5) "rose" 6) "5000"# 移除元素 zrem salary127.0.0.1:6379[1]> ZCARD salary (integer) 3# 查看元素的長度 zcard salary127.0.0.1:6379[1]> zadd salary 0 demo (integer) 1 127.0.0.1:6379[1]> zrem salary demo (integer) 1# zcount 獲取指定區(qū)間的成員數(shù)量127.0.0.1:6379[1]> zadd myset 1 aa 2 bb 3 cc (integer) 3 127.0.0.1:6379[1]> zcount myset 0 1 (integer) 1 127.0.0.1:6379[1]> zcount myset 1 3 (integer) 3

多查看官網(wǎng)文檔。。。

應(yīng)用:set排序,存儲成績表,工資表排序。

普通消息:1. 重要消息 2. 帶權(quán)重進(jìn)行判斷

排行榜應(yīng)用實現(xiàn):取top n測試。

kuangshenSayJava…

總結(jié)

以上是生活随笔為你收集整理的note.. redis五大数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。