1. 程式人生 > >基於Python的Redis操作

基於Python的Redis操作

目錄

Redis的注意點總結

一、Redis 安裝

1-1 Linux下安裝

1-2 Windows下安裝

二、Python模組安裝 - redis

三、Python 連線 Redis操作

3-1 普通連線

3-2 連線池連線 - 注意:程式僅生產一個池,即使用單例模式

四、redis模組 - String操作

4-1 設值

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-5 mset(mapping) - 批量插入

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 取值

4-2-1 get(name) - 單個獲取

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對應值的位元組長度

4-3 自增自減

五、redis模組 - Hash操作

5-1 設值

5-1-1 hset(name, key, value) - name表內設定key-value,若存在則修改

5-1-2 hmset(name, mapping) - 批量新增鍵值對

5-2 取值

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 自增自減

5-4-1 hincrby(name, key, amount=1) - 整數自增

5-4-2 hincrbyfloat(name, key, amount=1.0) - 浮點自增

六、redis模組 - List操作

6-1 設值

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 取值

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 刪值

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 其他

6-4-1 rpoplpush(src, dst) - 刪除src列表的最右元素,同時dst列表新增元素在最左

6-4-2 brpoplpush(src, dst, timeout=0) -  將列表src的最右元素,新增至,dst列表的最左

6-4-3 blpop(keys, timeout) - 多個列表排序,按照從左到右刪除對應列表的元素

6-5 自定義增量迭代 - 防止取出資料過大造成記憶體影響

七、redis模組 - Set(集合)操作

7-1 無序集合 Set

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-1-15 sscan(name, cursor=0, match=None, count=None)、sscan_iter(name, match=None, count=None) - 同字串操作,用於增量迭代分批獲取元素,避免記憶體消耗過大

7-2 有序集合 Zset

7-2-1 zadd(name, *args, **kwargs) - 新增元素

7-2-2 zcard(name) - 獲取集合元素數量

7-2-3 zcount(name, min, max) - 獲取集合[min, max],元素個數

7-2-4 zincrby(name, value, amount) - 自增name集合value的值,amount自增數

7-2-5 r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float) - 獲取[start, end]內元素

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]範圍內元素

7-2-15 zscan(name, cursor=0, match=None, count=None, score_cast_func=float)、zscan_iter(name, match=None, count=None,score_cast_func=float) - 同字串相似,相較於字串新增score_cast_func,用來對分數進行操作

八、redis模組 - 其他操作

九、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。 同時,這兩個接口根據數據類型和操作方式,又被劃分為若幹個子類,每個子類分別處理不同的操作類型,形成了一個操作的層次結