基於Python的Redis操作
目錄
3-2 連線池連線 - 注意:程式僅生產一個池,即使用單例模式
4-1-1 set(self, name, value, ex=None, px=None, nx=False, xx=False) - 單條插入
4-1-2 setnx(name, value) - 僅存在設值
4-1-3 setex(self, name, time, value) - x秒後刪除
4-1-4 psetex(name, time_ms, value) - x毫秒後刪除
4-1-6 setrange(name, offset, value) - 替代索引起的所有內容
4-1-7 setbit(name, offset, value) - 修改name的二進位制的位進
4-1-8 append(key, value) - key後追加value
4-2-2 mget(keys, *args) - 批量獲取
4-2-3 getset(name, value) - 獲取舊值並賦新
4-2-4 getrange(key, start, end) - 獲取指定區間值
4-2-5 getbit(name, offset) - name對應的值的二進位制表示中的某位的值 (0或1)
4-2-6 bitcount(key, start=None, end=None) - 獲取name對應的值的二進位制表示中 1 的個數
4-2-6 bitop(operation, dest, *keys) - 多值邏輯運算,結果儲存dest內
4-2-7 strlen(name) - 返回name對應值的位元組長度
5-1-1 hset(name, key, value) - name表內設定key-value,若存在則修改
5-1-2 hmset(name, mapping) - 批量新增鍵值對
5-2-1 hget(name,key) - name表內獲取key對應的值
5-2-2 hmget(name, keys, *args) - 批量獲值
5-2-3 hgetall(name) - 獲取name表內所有鍵值對(慎用,若資料過大易造成異常等)
5-2-4 hlen(name) - 獲取name表內鍵值對個數
5-2-5 hkeys(name) - 獲取name表中所有的key
5-2-6 hvals(name) - 獲取name表中所有value
5-2-7 hexists(name, key) - name表中是否存入key
5-2-8 hscan_iter(name, match=None, count=None) - 生成器獲取資料
5-2-9 hscan(name, cursor=0, match=None, count=None) - 指定遊標取資料(類切片)
5-3 hdel(name,*keys) - 刪除name表中的指定值
5-4-1 hincrby(name, key, amount=1) - 整數自增
5-4-2 hincrbyfloat(name, key, amount=1.0) - 浮點自增
6-1-1 lpush(name,values) - name列表中左側插入values
6-1-2 lpushx(name,value) - 僅在name存在時,在列表中左側插入values
6-1-3 rpush(name,values) - name列表中右側側插入values
6-1-4 rpushx(name,value) - 僅在name存在時,在列表中右側插入values
6-1-5 linsert(name, where, refvalue, value)) - 在name列表refvalue前後插入value
6-1-6 r.lset(name, index, value) - value覆蓋name列表的index位置的值
6-2-1 lindex(name, index) - 在name列表中根據index索引獲取列表元素
6-2-2 llen(name) - 獲取name列表元素個數
6-2-3 lrange(name, start, end) - 獲取name列表[start, end]的值
6-3-1 lrem(name, value, num) - 刪除name列表,num位置的value值
6-3-2 lpop(name) - name列表刪除左側第一個值,並返回第一個元素
6-3-3 ltrim(name, start, end) - 刪除name列表[start, end]的值
6-4-1 rpoplpush(src, dst) - 刪除src列表的最右元素,同時dst列表新增元素在最左
6-4-2 brpoplpush(src, dst, timeout=0) - 將列表src的最右元素,新增至,dst列表的最左
6-4-3 blpop(keys, timeout) - 多個列表排序,按照從左到右刪除對應列表的元素
7-1-1 sadd(name,values) - name對應的集合中新增元素
7-1-2 scard(name) - 獲取name集合內元素個數
7-1-3 sdiff(keys, *args) - 獲取在第一個集合卻不在其他集合中的集合物件
7-1-4 sdiffstore(dest, keys, *args) - 獲取第一個集合中且不在其他集合中的集合物件,新增到dest集合中
7-1-5 sinter(keys, *args) - 獲取多個指定集合的交際
7-1-6 sinterstore(dest, keys, *args) - 獲取多個指定集合的交集,並新增到dest集合中
7-1-7 sismember(name, value) - 檢查value是否是name集合元素
7-1-8 smembers(name) - 獲取name集合內所有成員
7-1-9 srandmember(name, numbers) - 獲取name集合中,隨機num個元素
7-1-10 sunion(keys, *args) - 獲取多個指定集合的並集,並返回
7-1-11 sunionstore(dest,keys, *args) - 獲取多個指定集合的並集,並儲存在dest集合內
7-1-12 smove(src, dst, value) - 將某個成員從一個集合中移動到另一個集合
7-1-13 spop(name) - 刪除最右元素,並返回
7-1-14 srem(name, values) - 刪除name集合所有values元素
7-2-1 zadd(name, *args, **kwargs) - 新增元素
7-2-3 zcount(name, min, max) - 獲取集合[min, max],元素個數
7-2-4 zincrby(name, value, amount) - 自增name集合value的值,amount自增數
7-2-6 zrank(name, value) - 獲取name集合value的索引值
7-2-7 zrangebylex(name, min, max, start=None, num=None) - 集合排序
7-2-8 zscore(name, value) - 獲取name集合對應value的對應分數
7-2-9 zinterstore(dest, keys, aggregate=None) - 獲取兩個有序集合交集
7-2-10 zunionstore(dest, keys, aggregate=None) - 獲取兩個有序集合並集
7-2-11 zrem(name, values) - 刪除name集合values元素們
7-2-12 zremrangebyrank(name, min, max) - 根據排行,刪除[min,max]範圍內元素
7-2-13 zremrangebyscore(name, min, max) - 根據分數,刪除[min,max]範圍內元素
7-2-14 zremrangebylex(name, min, max) - 根據值,刪除[min,max]範圍內元素
九、redis模組 - 管道實現事務操作(僅單機狀態,叢集無法實現)
Redis的注意點總結
- redis支援5大資料型別,但只針對於第一層的資料
- redis存取資料預設都為bytes型別decode_responses = False
- 使用decode_responses = True,將資料從bytes改為字串格式存入redis資料庫中
一、Redis 安裝
1-1 Linux下安裝
wget http://download.redis.io/releases/redis-3.0.6.tar.gz tar xzf redis-3.0.6.tar.gz cd redis-3.0.6 make 伺服器啟動 src/redis-server 啟動客戶端 src/redis-cli redis> set foo bar OK redis> get foo "bar"
1-2 Windows下安裝
官網下載 - 解壓檔案之後開啟server.exe 使用cli.exe進行連線
若伺服器端輸入ping,能返回pong,則說明連線成功
二、Python模組安裝 - redis
三、Python 連線 Redis操作
3-1 普通連線
import redis conn = redis.Redis(host='127.0.0.1',port=6379)
3-2 連線池連線 - 注意:程式僅生產一個池,即使用單例模式
redis-py使用connection pool來管理對一個redis server的所有連線,避免每次建立、釋放連線的開銷。
預設,每個Redis例項都會維護一個自己的連線池。
可以直接建立一個連線池,然後作為引數Redis,這樣就可以實現多個Redis例項共享一個連線池
import redis # max_connections連線池的最大連線數 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=10) conn= redis.Redis(connection_pool=pool)
四、redis模組 - String操作
4-1 設值
4-1-1 set(self, name, value, ex=None, px=None, nx=False, xx=False) - 單條插入
''' 在Redis中設定值,預設,不存在則建立,存在則修改 引數: ex,過期時間(秒) px,過期時間(毫秒) nx,如果設定為True,則只有name不存在時,當前set操作才執行,值存在,就修改不了,執行沒效果 xx,如果設定為True,則只有name存在時,當前set操作才執行,值存在才能修改,值不存在,不會設定新值 ''' set(name, value, ex=None, px=None, nx=False, xx=False) conn.set(key名, value值, 幾秒過期,幾毫秒過期, 是否只有name不存在是才進行插入,是否在name存在是進行插入)
4-1-2 setnx(name, value) - 僅存在設值
''' 設定值,只有name不存在時,執行設定操作(新增),如果存在,不會修改 ''' setnx(name, value) 等同於 set(name, value,nx=True)
4-1-3 setex(self, name, time, value) - x秒後刪除
''' ex,過期時間(秒)之後刪除 ''' setex(self, name, time, value) 等同於 set(name, value, ex=time)
4-1-4 psetex(name, time_ms, value) - x毫秒後刪除
''' px,過期時間(毫秒)之後刪除 ''' psetex(self, name, time_ms, value) 等同於 set(name, value, px= time_ms)
4-1-5 mset(mapping) - 批量插入
''' 批量設定值 ''' mget({'k1': 'v1', 'k2': 'v2'}) def mset(self, mapping): """ Sets key/values based on a mapping. Mapping is a dictionary of key/value pairs. Both keys and values should be strings or types that can be cast to a string via str(). 根據對映設定鍵/值。對映是一個字典鍵/值對。 鍵和值都應該是字串或型別可以通過str()轉換為字串。 """ items = [] for pair in iteritems(mapping): items.extend(pair) return self.execute_command('MSET', *items)
4-1-6 setrange(name, offset, value) - 替代索引起的所有內容
''' 修改字串內容,從指定字串索引開始向後替換(新值太長時,則向後新增) 引數: offset,字串的索引,位元組(一個漢字三個位元組) value,要設定的值 ''' conn.set('hello', '你好') # 一個漢字佔三個位元組,前閉後閉區間.取出字串指定某部分 print(conn.getrange('hello', 0, 2)) print(conn.getrange('hello', 0, 2).decode('utf-8')) # 一個漢子3個位元組,區閉區間,則必須從漢字索引後一位起 conn.setrange('hello', 3, '呀呀呀') print(conn.getrange('hello', 3, 5)) print(conn.getrange('hello', 3, 5).decode('utf-8')) ''' b'\xe4\xbd\xa0' 你 b'\xe5\x91\x80' 呀 '''
4-1-7 setbit(name, offset, value) - 修改name的二進位制的位進
# 對name對應值的二進位制表示的位進行操作 # 引數: # name,redis的name # offset,位的索引(將值變換成二進位制後再進行索引) # value,值只能是 1 或 0 # 注:如果在Redis中有一個對應: n1 = "foo", 那麼字串foo的二進位制表示為:01100110 01101111 01101111 所以,如果執行 setbit('n1', 7, 1),則就會將第7位設定為1, 那麼最終二進位制則變成 01100111 01101111 01101111,即:"goo"
4-1-8 append(key, value) - key後追加value
# 在redis name對應的值後面追加內容 # 引數: key, redis的name value, 要追加的字串
4-2 取值
4-2-1 get(name) - 單個獲取
conn.get('k1')
4-2-2 mget(keys, *args) - 批量獲取
def mget(self, keys, *args): """ Returns a list of values ordered identically to ``keys`` """ args = list_or_args(keys, args) options = {} if not args: options[EMPTY_RESPONSE] = [] return self.execute_command('MGET', *args, **options) conn.mget('k1','k2') conn.mget({'k1','k2'})
4-2-3 getset(name, value) - 獲取舊值並賦新
conn.getset('t1','test')
4-2-4 getrange(key, start, end) - 獲取指定區間值
''' 獲取子序列(根據位元組獲取,非字元) 引數: name,Redis 的 name start,起始位置(位元組) end,結束位置(位元組) 如: "你好" ,[0,2]表示 "你" ''' conn.set('hello', '你好') # 一個漢字佔三個位元組,前閉後閉區間.取出字串指定某部分 print(conn.getrange('hello', 0, 2)) print(conn.getrange('hello', 0, 2).decode('utf-8')) # >>> b'\xe4\xbd\xa0' # >>> 你
4-2-5 getbit(name, offset) - name對應的值的二進位制表示中的某位的值 (0或1)
# 獲取name對應的值的二進位制表示中的某位的值 (0或1) conn.getbit('hello', 0)
4-2-6 bitcount(key, start=None, end=None) - 獲取name對應的值的二進位制表示中 1 的個數
# 獲取name對應的值的二進位制表示中 1 的個數 # 引數: # key,Redis的name # start,位起始位置 # end,位結束位置
4-2-6 bitop(operation, dest, *keys) - 多值邏輯運算,結果儲存dest內
# 獲取多個值,並將值做位運算,將最後的結果儲存至新的name對應的值 # 引數: # operation,AND(並) 、 OR(或) 、 NOT(非) 、 XOR(異或) # dest, 新的Redis的name # *keys,要查詢的Redis的name # 如: bitop("AND", 'new_name', 'n1', 'n2', 'n3') # 獲取Redis中n1,n2,n3對應的值,然後講所有的值做位運算(求並集),然後將結果儲存 new_name 對應的值中
4-2-7 strlen(name) - 返回name對應值的位元組長度
# 返回name對應值的位元組長度(一個漢字3個位元組)
4-3 自增自減
4-3-1 incr(self, name, amount=1) - 整數自增
# 自增 name對應的值,當name不存在時,則建立name=amount,否則,則自增。 # 引數: # name,Redis的name # amount,自增數(必須是整數) # 注:同incrby
4-3-2 incrbyfloat(self, name, amount=1.0) -浮點自增
# 自增 name對應的值,當name不存在時,則建立name=amount,否則,則自增。 # 引數: # name,Redis的name # amount,自增數(浮點型)
4-3-3 decr(self, name, amount=1) - 自減
# 自減 name對應的值,當name不存在時,則建立name=amount,否則,則自減。 # 引數: # name,Redis的name # amount,自減數(整數)
五、redis模組 - Hash操作
5-1 設值
5-1-1 hset(name, key, value) - name表內設定key-value,若存在則修改
# name對應的hash中設定一個鍵值對(不存在,則建立;否則,修改) # 引數: # name,redis的name # key,name對應的hash中的key # value,name對應的hash中的value # 注: # hsetnx(name, key, value),當name對應的hash中不存在當前key時則建立(相當於新增)
5-1-2 hmset(name, mapping) - 批量新增鍵值對
# 在name對應的hash中批量設定鍵值對 # 引數: # name,redis的name # mapping,字典,如:{'k1':'v1', 'k2': 'v2'} # 如: # r.hmset('xx', {'k1':'v1', 'k2': 'v2'}) # 通過單次設值實現批量設值 for i in range(1000): conn.hset('m2','key%s'%i,'value%s'%i)
5-2 取值
5-2-1 hget(name,key) - name表內獲取key對應的值
# 在name對應的hash中獲取根據key獲取value
5-2-2 hmget(name, keys, *args) - 批量獲值
# 在name對應的hash中獲取多個key的值 # 引數: # name,reids對應的name # keys,要獲取key集合,如:['k1', 'k2', 'k3'] # *args,要獲取的key,如:k1,k2,k3 # 如: # r.mget('xx', ['k1', 'k2']) # 或 # print r.hmget('xx', 'k1', 'k2')
5-2-3 hgetall(name) - 獲取name表內所有鍵值對(慎用,若資料過大易造成異常等)
# 獲取name對應hash的所有鍵值 print(re.hgetall('xxx').get(b'name'))
5-2-4 hlen(name) - 獲取name表內鍵值對個數
# 獲取name對應的hash中鍵值對的個數
5-2-5 hkeys(name) - 獲取name表中所有的key
# 獲取name對應的hash中所有的key的值
5-2-6 hvals(name) - 獲取name表中所有value
# 獲取name對應的hash中所有的value的值
5-2-7 hexists(name, key) - name表中是否存入key
# 檢查name對應的hash是否存在當前傳入的key
5-2-8 hscan_iter(name, match=None, count=None) - 生成器獲取資料
# 利用yield封裝hscan建立生成器,實現分批去redis中獲取資料 # 引數: # match,匹配指定key,預設None 表示所有的key # count,每次分片最少獲取個數,預設None表示採用Redis的預設分片個數 # 如: # for item in r.hscan_iter('xx'): # print item # 問:我redis中字典有10000w條資料,全部打印出來 for i in range(1000): conn.hset('m2','key%s'%i,'value%s'%i) # 指定每次取10條,直到取完 ret=conn.hscan_iter('m2',count=100) print(next(ret)) print(next(ret)) for i in ret: print(i) # 錯誤方式 ret=conn.hgetall('m2') # ------------原始碼------------------ def hscan_iter(self, name, match=None, count=None): """ Make an iterator using the HSCAN command so that the client doesn't need to remember the cursor position. ``match`` allows for filtering the keys by pattern ``count`` allows for hint the minimum number of returns """ cursor = '0' while cursor != 0: cursor, data = self.hscan(name, cursor=cursor, match=match, count=count) for item in data.items(): yield item
5-2-9 hscan(name, cursor=0, match=None, count=None) - 指定遊標取資料(類切片)
# 增量式迭代獲取,對於資料大的資料非常有用,hscan可以實現分片的獲取資料,並非一次性將資料全部獲取完,從而放置記憶體被撐爆 # 引數: # name,redis的name # cursor,遊標(基於遊標分批取獲取資料) # match,匹配指定key,預設None 表示所有的key # count,每次分片最少獲取個數,預設None表示採用Redis的預設分片個數 # 如: # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) # ... # 直到返回值cursor的值為0時,表示資料已經通過分片獲取完畢 ret = conn.hscan('m2', count=300) print(len(ret[1])) print(ret) # -----------原始碼------------- def hscan(self, name, cursor=0, match=None, count=None): """ Incrementally return key/value slices in a hash. Also return a cursor indicating the scan position. ``match`` allows for filtering the keys by pattern ``count`` allows for hint the minimum number of returns """ pieces = [name, cursor] if match is not None: pieces.extend([Token.get_token('MATCH'), match]) if count is not None: pieces.extend([Token.get_token('COUNT'), count]) return self.execute_command('HSCAN', *pieces)
5-3 hdel(name,*keys) - 刪除name表中的指定值
# 將name對應的hash中指定key的鍵值對刪除 conn.hdel('m2','key1','key2') def hdel(self, name, *keys): "Delete ``keys`` from hash ``name``" return self.execute_command('HDEL', name, *keys) # 可行方式 conn.hdel('m2',*['key1','key2']) # 錯誤方式 conn.hdel('m2',['key1','key2'])
5-4 自增自減
5-4-1 hincrby(name, key, amount=1) - 整數自增
# 自增name對應的hash中的指定key的值,不存在則建立key=amount # 引數: # name,redis中的name # key, hash對應的key # amount,自增數(整數) 應用場景: 統計文章閱讀數:key是文章id,value是文章閱讀數,有一個閱讀者,數字加一。 資料線儲存在Redis內,在某一時間點,儲存到MySQL等資料庫內,進行同步操作。
5-4-2 hincrbyfloat(name, key, amount=1.0) - 浮點自增
# 自增name對應的hash中的指定key的值,不存在則建立key=amount # 引數: # name,redis中的name # key, hash對應的key # amount,自增數(浮點數) # 自增name對應的hash中的指定key的值,不存在則建立key=amount
六、redis模組 - List操作
相關推薦
Hadoop Shell命令(基於linux操作系統上傳下載文件到hdfs文件系統基本命令學習)
指南 統計信息 ... err nor 清空 ext -- als Apache-->hadoop的官網文檔命令學習:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html FS Shell 調用文件系統
理解及操作環境變量(基於Mac操作)
命令行 操作 便是 恢復 grep shell操作 同時 /usr 輸入 通過本文,簡單的了解環境變量及其操作,與便於遇到相關問題時能夠準確快捷的解決。 什麽是環境變量 An environment variable is a dynamic-named value th
第一次作業:基於Linux操作系統的進程模型分析
一起 正常 std 文本 pid 存儲 time 計算機 關於 1.什麽是進程 ·進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄
第一次作業:基於linux操作系統深入源碼進程模型分析
getpid tree 容器 svi 執行過程 網絡服務 -h cfs 阻塞 1.關於進程 定義: 進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程
基於Curator操作ZooKeeper(三)-Curator整合Spring
Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(一)-基本操作 基於Curator操作ZooKeeper(二)-Watche
基於Curator操作ZooKeeper(二)-Watcher操作-補充TreeCache
轉自:https://blog.csdn.net/Leafage_M/article/details/78735485#treecache Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二)
基於Curator操作ZooKeeper(二)-Watcher操作
Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(一)-基本操作 基於Curator操作ZooKeeper(二)-Watche
基於Curator操作ZooKeeper(一)-基本操作
Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(二)-Watcher操作 基於Curator操作ZooKeeper(二)-W
基於減法操作除法器的演算法---Verilog實現
引言 除法器在FPGA裡怎麼實現呢?當然不是讓用“/”和“%”實現。 在Verilog HDL語言中雖然有除的運算指令,但是除運算子中的除數必須是2的冪,因此無法實現除數為任意整數的除法,很大程度上限制了它的使用領域。並且多數綜合工具對於除運算指令不能綜合出令人滿意
Shell 基於Docker操作InfluxDB安裝建庫建立使用者並授權
InfluxDB提供了一些輔助命令,使得我們可以不用進入到influxdb控制檯裡面就可以操作,這點很像mysql,所以實現起來很方便快捷。 目錄 安裝指令碼 資料庫操作指令碼 執行輸出 安裝指令碼 docker_influxdb_install.sh #! /b
基於Python操作ElasticSearch
環境依賴: Python:2.7 ES依賴包:pyelasticsearch 本文主要就ES基本的CRUD操作做以歸納整理,ES官方對Python的依賴支援有很多,eg:pyelasticsearch、ESClient、elasticutils、pyes、rawes、Surfiki Refine等。博
Nginx之——日誌按日期分割的實現(基於CentOS操作系統)
重新 mod local 操作系統 pan ron nginx日誌 chmod auto Nginx自身是沒有按日期切割日誌的功能,可以用shell腳本實現。新建一個cut_log.sh, #!/bin/sh # Program: # Auto cut n
java基於jdbc操作mysql實現增刪改查日誌完整程式碼 不足之處歡迎留言指導
1、建立Java Project專案 2、匯入Jar包 3、建立資料庫 //根據實體類建立資料庫 4、建立實體類 (Bm.java) public class Bm { private int id; private String rq;
eigen稀疏矩陣拼接(基於塊操作的二維拼接)的思考
eigen稀疏矩陣拼接(塊操作) 關於稀疏矩陣的塊操作:參考官方連結 However, for performance reasons, writing to a sub-sparse
python基礎之socket編程-------基於tcp的套接字實現遠程執行命令的操作
logs lose stream res std 遠程控制 python log out 遠程實現cmd功能: import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOC
基於CentOS 6 系統創建邏輯卷LVM,執行擴容,縮減,刪除等操作
靈活 硬盤 erl borde pan local lock 地址 擁有 基於CentOS 6 系統創建邏輯卷LVM,執行擴容,縮減,刪除等操作 2016-08-29 05:37:57 標簽:Linux LVM Fstab VG PV 原創作品,允許轉載,轉載時請務
【ALB學習筆記】基於.NET環境的高頻RFID卡讀寫設備的基本操作案例
範例 write load rgs 顯示 職業 ner num cte 基於.NET環境的高頻RFID卡讀寫設備的基本操作案例 廣東職業技術學院 歐浩源 1、引言 RFID高頻卡在我們的日常生活中隨處可見,是物聯網應用中不可或缺的一個重要部分,也是全國職業
虛擬機字節碼操作引擎-----基於棧的字節碼解釋引擎
his 一點 源碼 生成器 移植 硬件 基於 優化器 16px 虛擬機調用方法可以有解析和分派兩種方式,那麽虛擬機是如何執行方法中的字節碼指令的? 1.解釋執行 談是解釋執行還是翻譯執行沒有意義了,只有確定了某種具體的java實現版本和執行引擎運行模式時,談解釋執行還是
基於Metronic的Bootstrap開發框架經驗總結(17)-- 使用 summernote插件實現HTML文檔的編輯和圖片插入操作
系統 cat 寫入 視頻 編寫 查看 absolute upload form 在很多場合,我們需要在線編輯HTML內容,然後在頁面上或者其他終端上(如小程序、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現H
八、基於字節的I/O操作接口
pan 層次結構 操作系統 本地 文件 其它 說明 輸出 jdk 基於字節的I/O操作接口輸入和輸出分別是InputStream和OutputStream。 同時,這兩個接口根據數據類型和操作方式,又被劃分為若幹個子類,每個子類分別處理不同的操作類型,形成了一個操作的層次結