1. 关于set的覆盖问题
在默认情况下,对一个已经设置了值的字符串键执行SET命令将导致键的旧值被新值覆盖。
从Redis2.6.12版本开始,用户可以通过向SET命令提供可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值:SET key value [NX|XX]
如果用户在执行SET命令时给定了NX选项,那么SET命令只会在键没有值的情况下执行设置操作,并返回OK表示设置成功;如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。
以下代码展示了带有NX选项的SET命令的行为:
redis> SET password "123456" NX # OK 对尚未有值的password键进行设置,成功
redis> SET password "999999" NX # (nil) password键已经有了值,设置失败
如果用户在执行SET命令时给定了XX选项,那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。
举个例子,如果我们对一个没有值的键mongodb-homepage执行以下SET命令,那么命令将因为XX选项的作用而放弃执行设置操作:
redis> SET mongodb-homepage "mongodb.com" XX # (nil)
因为第二条SET命令没有改变password键的值,所以password键的值仍然是刚开始时设置的"123456"。
相反,如果我们对一个已经有值的键执行带有XX选项的SET命令,那么命令将使用新值去覆盖已有的旧值:
redis> SET mysql-homepage "mysql.org" # OK为键mysqlhomepage设置一个值
redis> SET mysql-homepage "mysql.com" XX # OK对键的值进行更新
在第二条SET命令执行之后,mysql-homepage键的值将从原来的"mysql.org"更新为"mysql.com"。
2.字符串总结
- Redis的字符串键可以把单独的一个键和单独的一个值在数据库中关联起来,并且这个键和值既可以存储文字数据,又可以存储二进制数据。
- SET命令在默认情况下会直接覆盖字符串键已有的值,如果我们只想在键不存在的情况下为它设置值,那么可以使用带有
NX
选项的SET
命令;相反,如果我们只想在键已经存在的情况下为它设置新值,那么可以使用带有XX选项的SET命令。 - 使用
MSET
、MSETNX
以及MGET
命令可以有效地减少程序的网络通信次数,从而提升程序的执行效率。 - Redis用户可以通过制定命名格式来提升Redis数据的可读性并避免键名冲突。·字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增;字符串值的负数索引以1为开始,从字符串的结尾向开头不断递减。
-
GETRANGE key start end
命令接受的是闭区间索引范围,位于start索引和end索引上的值也会被包含在命令返回的内容当中。 -
SETRANGE
命令在需要时会自动对字符串值进行扩展,并使用空字节填充新扩展空间中没有内容的部分。 -
APPEND
命令在键不存在时执行设置操作,在键存在时执行追加操作。 - Redis会把能够被表示为long long int类型的整数以及能够被表示为long double类型的浮点数当作数字来处理。
3. 存取散列
info = {
'name': 'ChiOS',
'age': 29,
'sex': 'M'
}
client = Redis(decode_responses=True)
result = client.hmset('user_info', info) # 存
print(result)
result = client.hgetall('user_info') # 取
print(result)
4.散列总结
- 散列键会将一个键和一个散列在数据库中关联起来,用户可以在散列中为任意多个字段设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
- 用户可以通过散列键把相关联的多项数据存储到同一个散列中,以便对其进行管理,或者针对它们执行批量操作。
- 因为Redis并没有为散列提供相应的减法操作命令,所以如果用户想对字段存储的数字值执行减法操作,就需要将负数增量传递给
HINCRBY
命令或HINCRBYFLOAT
命令。 - Redis散列包含的字段在底层是以无序方式存储的,根据字段插入的顺序不同,包含相同字段的散列在执行
HKEYS
、HVALS
和HGETALL
等命令时可能会得到不同的结果,因此用户在使用这3个命令时,不应该对命令返回元素的排列顺序作任何假设。 - 字符串键和散列键虽然在操作方式上非常相似,但是因为它们都拥有各自独有的优点和缺点,所以在一些情况下,这两种数据结构是没有办法完全代替对方的。因此用户在构建应用程序的时候,应该根据实际需要来选择相应的数据结构。