本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/120334491
因为最近的需求常常接触到Redis,我就把自己学习、使用的 做些分享;
这是我学习数据库知识: https://blog.csdn.net/zyooooxie/category_10994045.html
个人博客:https://blog.csdn.net/zyooooxie
Redis
Redis:Remote DIctionary Server,是一个高性能的(key / value)分布式内存数据库基于内存运行,并支持持久化的NoSQL数据库。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储;
Redis命令
在我的日常工作中,最常用到的有:
- 服务器相关
SELECT index 【默认使用 0 号数据库;默认16个】
INFO
DBSIZE
- Key
KEYS key* 【KEYS命令 不能用于生产环境】
TYPE KEY_NAME
DEL KEY_NAME 【DEL KEY_NAME1 KEY_NAME2 KEY_NAME3】
EXPIRE KEY_NAME seconds
TTL KEY_NAME 【-1表示永不过期,-2表示已经过期】
- String:单值单value
GET KEY_NAME 【GET 只能用于处理字符串值】
SET KEY_NAME KEY_VALUE 【新建、覆盖】
GETSET KEY_NAME KEY_VALUE 【返回 KEY_NAME的旧值】
SETEX KEY_NAME seconds KEY_VALUE 【等同 SET key value EX second】
MGET KEY_NAME1 KEY_NAME2
MSET KEY_NAME1 KEY_VALUE1 KEY_NAME2 KEY_VALUE2
- Hash:kv模式不变,但v是 N个键值对
HDEL MY_HASH field 【HDEL MY_HASH field1 field2 field3】
HGET MY_HASH field
HGETALL MY_HASH
HSET MY_HASH field value
HKEYS MY_HASH
HVALS MY_HASH
- List:单值多value
LPUSH LIST_NAME VALUE1 VALUE2 【插入到 列表 的表头】
RPUSH LIST_NAME VALUE1 VALUE1 【插入到列表 的表尾】
LINDEX LIST_NAME index 【index正 0开始;反 -1开始】
LLEN LIST_NAME
LRANGE LIST_NAME start stop
LSET LIST_NAME index VALUE 【index 不可超出范围】
LINSERT LIST_NAME BEFORE|AFTER old_VALUE new_VALUE 【插入新增】
LPOP LIST_NAME 【移除并返回 列表的头元素】
RPOP LIST_NAME 【移除并返回 列表 的尾元素】
想要详细学习 可以参考 http://doc.redisfans.com/index.html
代码
Python 要使用 redis,需要先安装 redis 模块:pip install redis;
def redis_connect(host: str, port: int, pwd: str):
"""
连接池
:param host:
:param port:
:param pwd:
:return:
"""
# redis取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
pool = redis.ConnectionPool(host=host, port=port, decode_responses=True, password=pwd, db=0)
r = redis.Redis(connection_pool=pool)
return r
def test_csdn():
r = redis_connect(gl_host, gl_port, gl_pwd)
print(r.info())
print(r.keys('*TASK*'))
r_str = 'APP_TASK:zyooooxie'
r_hash = 'ABzyooooxie'
r_list = 'external-zyooooxie'
r_no_exist = 'zy-test'
# TYPE 命令
# none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
print(r.type(r_str)) # string
print(r.type(r_hash)) # hash
print(r.type(r_list)) # list
print(r.type(r_no_exist))
# TTL 命令
# 当 key 不存在时,返回 -2 。
# 当 key 存在但没有设置剩余生存时间时,返回 -1 。
# 否则,以秒为单位,返回 key 的剩余生存时间。
print(r.ttl(r_str))
print(r.ttl(r_hash))
print(r.ttl(r_list))
print(r.ttl(r_no_exist))
r.close()
def test_csdn2():
r = redis_connect(gl_host, gl_port, gl_pwd)
r_no_exist = 'zy-test'
test_str = 'str_zy'
value = 'test-{}'.format(time.time())
ex = 600
r.set(test_str, value)
# get() 当 key 不存在时,返回 None ;否则,返回 key 的值。
print(r.get(r_no_exist))
print(r.get(test_str))
print(r.ttl(test_str))
# set() 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
# 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键 原有的 TTL 将被清除。
r.set(test_str, value * 2, ex=ex)
print(r.get(test_str))
time.sleep(3)
print(r.ttl(test_str))
r.expire(test_str, 60)
print(r.ttl(test_str))
r.delete(test_str)
print(r.get(test_str))
# ``time`` can be represented by an integer or a Python timedelta object.
# 简单的用法 还是直接传 int
from datetime import timedelta
r.setex(test_str, timedelta(hours=1), value * 3)
print(r.ttl(test_str))
print(r.get(test_str))
# 批量赋值
# 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().
r.mset({
'key1': 'value1', 'key2': 'value2', 'key3': 'value3', test_str: '最新'})
# 批量获取值
# Returns a list of values ordered identically to ``keys``
print(r.mget('key1', 'key3', 'key2', test_str))
# getset() 返回给定 key 的旧值。
# 当 key 没有旧值时,也即是key不存在时,返回 None 。
print(r.getset(test_str, 'getset()设置'), '这是getset() 返回的旧值')
print(r.get(test_str), 'getset()执行后的值')
print(r.getset(test_str * 10, 'getset()设置 不存在的key'))
print(r.get(test_str * 10))
r.delete('key1', 'key3', 'key2', test_str, test_str * 10)
print(r.mget('key1', test_str))
r.close()
def test_csdn3():
r = redis_connect(gl_host, gl_port, gl_pwd)
test_hash = 'hash_zy'
# Return a Python dict of the hash's name/value pairs
print(r.hgetall(test_hash))
hash_field = 'zy123'
hash_value = 456
# Return the value of ``key`` within the hash ``name``
print(r.hget(test_hash, hash_field))
r.hset(test_hash, hash_field, hash_value)
print(r.hget(test_hash, hash_field))
# ``mapping`` accepts a dict of key/value pairs
r.hset(test_hash, mapping={
hash_field * 2: hash_value * 2})
print(r.hgetall(test_hash))
r.hdel(test_hash, hash_field)
print(r.hgetall(test_hash))
# Redis.hmset() is deprecated. Use Redis.hset() instead
# 少用hmset()
r.hmset(test_hash, mapping={
hash_field * 3: hash_value * 3, hash_field * 4: hash_value * 4})
print(r.hgetall(test_hash))
print(r.hkeys(test_hash), 'HKEYS')
print(r.hvals(test_hash), 'HVALS')
# Returns a list of values ordered identically to ``keys``
print(r.hmget(test_hash, keys=(hash_field * 3, hash_field * 5, hash_field)))
r.hdel(test_hash, hash_field * 3, hash_field * 5)
print(r.hgetall(test_hash))
r.delete(test_hash)
r.close()
def test_csdn4():
r = redis_connect(gl_host, gl_port, gl_pwd)
test_list = 'list_zy'
r.rpush(test_list, '1f', '2s') # 新插入元素在右侧,如果list不存在则新建
print(r.llen(test_list))
# ``start`` and ``end`` can be negative numbers
print(r.lrange(test_list, 0, -1))
print(r.lindex(test_list, 0))
# Negative indexes are supported and will return an item at the end of the list
print(r.lindex(test_list, -1))
r.rpush(test_list, '3t')
print(r.lrange(test_list, -10, 11))
r.lpush(test_list, 'xin0')
print(r.llen(test_list))
print(r.lrange(test_list, 0, -1))
# Remove and return the last item of the list ``name``
r.rpop(test_list)
print(r.lrange(test_list, 0, -1))
# Remove and return the first item of the list ``name``
r.lpop(test_list)
print(r.lrange(test_list, 0, -1))
# lset() 将列表 key 下标为 index 的元素的值设置为 value
# 【重新赋值,不新增】
# r.lset(test_list, 3, 'new-4') # 超出范围 index out of range
print(r.llen(test_list))
r.lset(test_list, 1, 'new-1新值') # index要小于len;
r.lset(test_list, 0, '改0')
print(r.lrange(test_list, 0, -1))
r.lset(test_list, 0, 'new-0-新值')
print(r.lrange(test_list, 0, -1), '执行 lset()')
# linsert() 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
# 【新增】
r.linsert(test_list, 'BEFORE', 'new-0-新值', 'insert的1') # where: BEFORE(前)或AFTER(后)
print(r.lrange(test_list, 0, -1))
r.linsert(test_list, 'AFTER', 'new-0-新值', 'insert的3')
print(r.lrange(test_list, 0, -1))
# Returns the new length of the list on success or -1 if ``refvalue`` is not in the list.
print(r.linsert(test_list, 'BEFORE', 'new-0-新值', 'insert的2'))
print(r.lrange(test_list, 0, -1))
r.linsert(test_list, 'AFTER', '这是假的', '看看有没有变化')
print(r.linsert(test_list, 'AFTER', '这是假的2', '看看有没有变化2'))
print(r.lrange(test_list, 0, -1), '当 pivot 不存在于列表 key 时,不执行任何操作。')
r.delete(test_list)
r.close()
本文链接:https://blog.csdn.net/zyooooxie/article/details/120334491
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie