redis常用命令总结

客户端连接

redis-cli -h IP地址 -p 端口
redis-cli # 默认连接本机的6379端口
127.0.0.1:6379>ping
PONG

数据类型

字符串类型(string)

# 普通设置键值
1、set key value
# setnx key value : 键不存在时才能进行设置
2、setnx key value
# 设置过期时间
3、set key value ex seconds
4、get key
# 同时设置多个值,获取多个值
5、mset key1 value1 key2 value2 
6、mget key1 key2 key3 
# 获取值的长度
7、strlen key 
扩展内容:
# 从索引值开始,value替换原内容
setrange key 索引值 value
# 获取指定范围切片内容
getrange key 起始值 终止值
# 追加拼接value的值
append key value
# 整数操作,key里面得整数值加上或减去步长
INCRBY key 步长
DECRBY key 步长
INCR key : +1操作
DECR key : -1操作
# 浮点数操作
incrbyfloat key step
通用命令
# 切换库
select number
# 查看键
keys * 
# 键类型
TYPE key
# 键是否存在
exists key
# 删除键
del key
# 键重命名
rename key newkey
# 返回旧值并设置新值(如果键不存在,就创建并赋值)
getset key value
# 清除当前库中所有数据(慎用)
flushdb
# 清除所有库中所有数据(慎用)
flushall

列表数据类型(List)

头尾压入元素(LPUSH | RPUSH)
# 从左往右
1、LPUSH key value
# 从右往左
​2、RPUSH key value

查看|设置 列表元素
# 查看(LRANGE)
LRANGE key start stop
# 查看列表中所有元素
LRANGE key 0 -1

# 获取指定位置元素(LINDEX)
LINDEX key index
# 设置指定位置元素的值(LSET)
LSET key index value
# 获取列表长度(LLEN)
LLEN key
头尾弹出元素(LPOP | RPOP)
# 从列表头部弹出一个元素
LPOP key
# 从列表尾部弹出一个元素
RPOP key
# 从一个列表尾部弹出元素压入到另一个列表头部
RPOPLPUSH source destination
RPOPLPUSH mylist1 mylist2

移除指定元素(LREM)
LREM key count value
count>0:表示从头部开始向表尾搜索,移除与value相等的元素,数量为count
count<0:表示从尾部开始向表头搜索,移除与value相等的元素,数量为count
count=0:移除表中所有与value相等的值

去除指定范围外元素(LTRIM),也就是只保留指定内得元素
LTRIM key start stop
列表中插入值(LINSERT)
LINSERT key BEFORE|AFTER pivot value
key和pivot不存在,不进行任何操作
# 在2元素之后加上666
LINSERT mylist2 after 2 666
# 在4元素之前加上888
LINSERT mylist2 before 4 888

阻塞弹出(BLPOP | BRPOP)
BLPOP key timeout
BRPOP key timeout

1、如果弹出的列表不存在或者为空,就会阻塞
2、超时时间设置为0,就是永久阻塞,直到有数据可以弹出
3、如果多个客户端阻塞再同一个列表上,使用First In First Service原则,先到先服务

与python交互

字符串
import redis

r = redis.Redis(host='192.168.43.49',port=6379,db=0)

r.set('mystring','python')
# b'python'
print(r.get('mystring'))
# False
print(r.setnx('mystring','socket'))
# mset:参数为字典
r.mset({'mystring2':'mysql','mystring3':'mongodb'})
# mget:结果为一个列表
print(r.mget('mystring','mystring2','mystring3'))
# mystring长度:6
print(r.strlen('mystring'))
# 数字类型操作
r.set('number',10)
r.incrby('number',5)
r.decrby('number',5)
r.incr('number')
r.decr('number')
r.incrbyfloat('number',6.66)
r.incrbyfloat('number',-6.66)
# b'10'
print(r.get('number'))
列表
import redis

r = redis.Redis(host='192.168.43.49',port=6379,db=0)
# ['mysql','redis']
r.lpush('pylist','redis','mysql')
# ['mysql','redis','django','spider']
r.rpush('pylist','django','spider')
# ['mysql','redis','django','spider','AI']
r.linsert('pylist','after','spider','AI')
# 5
print(r.llen('pylist'))
# ['redis','django','spider']
r.lpop('pylist')
r.rpop('pylist')
# ['redis','django','spider']
print(r.lrange('pylist',0,-1))
# ['redis','spider']
r.lrem('pylist',0,'django')
# 返回True,['redis']
r.ltrim('pylist',0,0)
# 返回True,['spiderman']
r.lset('pylist',0,'spiderman')

r.delete('pylist')

位图操作bitmap

# 设置某一位上的值(offset是偏移量,从0开始)
setbit key offset value
# 获取某一位上的值
GETBIT key offset
# 统计键所对应的值中有多少个 1 
BITCOUNT key

Hash散列数据类型

# 1、设置单个字段
HSET key field value
HSETNX key field value
# 2、设置多个字段
HMSET key field value field value
# 3、返回字段个数
HLEN key
# 4、判断字段是否存在(不存在返回0)
HEXISTS key field
# 5、返回字段值
HGET key field
# 6、返回多个字段值
HMGET key field filed
# 7、返回所有的键值对
HGETALL key
# 8、返回所有字段名
HKEYS key
# 9、返回所有值
HVALS key
# 10、删除指定字段
HDEL key field 
# 11、在字段对应值上进行整数增量运算
HINCRBY key filed increment
# 12、在字段对应值上进行浮点数增量运算
HINCRBYFLOAT key field increment
python基本方法
# 1、更新一条数据的属性,没有则新建
hset(name, key, value) 
# 2、读取这条数据的指定属性, 返回字符串类型
hget(name, key)
# 3、批量更新数据(没有则新建)属性
hmset(name, mapping)
# 4、批量读取数据(没有则新建)属性
hmget(name, keys, *args)
# 5、获取这条数据的所有属性和对应的值,返回字典类型
hgetall(name)
# 6、获取这条数据的所有属性名,返回列表类型
hkeys(name)
# 7、删除这条数据的指定属性
hdel(name, *keys)
python的hash散列
import redis

r = redis.Redis(host="192.168.43.49", port=6379, db=0,password='123456')
# 新建一条键名为"userinfo"的数据, 包含属性username
r.hset("userinfo", "username", 'zhanshen001')
# 更改键名为"userinfo"的数据, 更改属性username的值
r.hset("userinfo", "username", 'zhanshen002')

# 取出属性username的值
username = r.hget("userinfo", "username")

# 输出看一下(发现属性值已经为str)
print('username',username)

# 属性集合
user_dict = {
    "password": "123456",
    "name": "Wang Success",
    "sex": "male",
    "height": '178',
    "Tel": '13838383888',
}
# 批量添加属性
r.hmset("userinfo", user_dict)
# 取出所有数据(返回值为字典)
h_data = r.hgetall("userinfo")
print('all:', h_data)
# 删除属性(可以批量删除)
r.hdel("userinfo", "Tel")
# 取出所有属性名
h_keys = r.hkeys("userinfo")
print('all_key_name:',h_keys)
# 取出所有属性值
h_values = r.hvals('userinfo')
print('all_values:',h_values)

# 设置过期时间为5分钟
r.expire(username,60*5)

集合数据类型(set)

# 1、增加一个或者多个元素,自动去重
SADD key member1 member2
# 2、查看集合中所有元素
SMEMBERS key
# 3、删除一个或者多个元素,元素不存在自动忽略
SREM key member1 member2
# 4、元素是否存在
SISMEMBER key member
# 5、随机返回集合中指定个数的元素,默认为1个
SRANDOMMEMBER key count
# 6、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了
SCARD key
# 7、把元素从源集合移动到目标集合
SMOVE source destination member
# 8、差集(number1 1 2 3 number2 1 2 4)
SDIFF key1 key2 
# 9、差集保存到另一个集合中
SDIFFSTORE destination key1 key2
# 10、交集
SINTER key1 key2
SINTERSTORE destination key1 key2
# 11、并集
SUNION key1 key2
SUNIONSTORE destination key1 key2

有序集合sortedset

# 在有序集合中添加一个成员
zadd key score member
# 查看指定区间元素(升序)
zrange key start stop [withscores]
# 查看指定区间元素(降序)
ZREVRANGE key start stop [withscores]
# 查看指定元素的分值
ZSCORE key member
# 返回指定区间元素
# offset : 跳过多少个元素
# count : 返回几个
# 小括号 : 开区间  zrangebyscore fruits (2.0 8.0
zrangebyscore key min max [withscores] [limit offset count]
# 删除成员
zrem key member
# 增加或者减少分值
zincrby key increment member
# 返回元素排名
zrank key member
# 返回元素逆序排名
zrevrank key member
# 删除指定区间内的元素
zremrangebyscore key min max
# 返回集合中元素个数
zcard key
# 返回指定范围中元素的个数
zcount key min max
zcount fruits 4 7 
zcount fruits (4 7
# 并集
zunionstore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX]
# 交集:和并集类似,只取相同的元素
ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX

redis分布式锁

def test_api(request):
	# 解决方法二:redis分布式锁
    import redis
    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    try:
        with r.lock('guoxiaonao', blocking_timeout=3) as lock:
            u = UserProfile.objects.get(username='guoxiaonao')
            u.score += 1
            u.save()
    except Exception as e:
        print('lock is failed')

分布式锁原理:

从redis2.8开始,set命令集成了两个参数,nx和ex,先拿nx来争抢锁,抢到之后,再用ex参数给锁加一个过期时间防止锁忘记了释放,造成死锁
应用场景:秒杀活动
    进程1:set miaosha aaa nx ex 3 获取锁
        秒杀记录 -1
        del miaosha
    进程2:set miaosha 111 nx ex 3 无法获取锁

# 2.8以前是两条命令,这样容易造成死锁
# setnx key value # 获取锁
# expier key 5 # 释放锁

# 解决方法:redis分布式锁
    import redis

    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    try:
        with r.lock('guoxiaonao', blocking_timeout=3) as lock:
            u = UserProfile.objects.get(username='yanxu')
            u.score += 1
            u.save()
    except Exception as e:
        print('lock is failed')
    return JsonResponse({"msg": 'test is ok'})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值