Redis

  • 五大数据类型
    • Redis-key
    • String
    • List
    • Set
    • Hash
    • Zset(有序集合)
  • 三种特殊数据类型
    • Geospatial 地理位置
    • Hyperloglog
    • Bitmap
  • 事务

五大数据类型

Redis-key

# 1.type 返回key所存储的值的类型
# 返回值 返回 key 的数据类型,数据类型有:
# none (key不存在)
# string (字符串)
# list (列表)
# set (集合)
# zset (有序集)
# hash (哈希表)
127.0.0.1:6379> set weather "sunny"
OK
127.0.0.1:6379> type weather
string# 2.rename 修改key的名称
# 改名成功则返回ok,失败则返回一个错误
127.0.0.1:6379> rename weather tianqi
OK
127.0.0.1:6379> get weather
(nil)
127.0.0.1:6379> get tianqi
"sunny"
# newkey已存在时,rename会覆盖旧newkey
127.0.0.1:6379> set pc "lenovo"
OK
127.0.0.1:6379> set perspnal_computer "dell"
OK
127.0.0.1:6379> rename pc personal_computer
OK
127.0.0.1:6379> get pc
(nil)
127.0.0.1:6379> get personal_computer  #原来的值dell被覆盖了
"lenovo"
# 另一种可防止原来的newkey被覆盖 renamenx 仅当newkey不存在时改名# 3.persist 移除key的过期时间,key将持久化保持
127.0.0.1:6379> persist tianqi   #未设置过期时间的话 无法执行
(integer) 0
127.0.0.1:6379> expire tianqi 10
(integer) 1
127.0.0.1:6379> persist tianqi
(integer) 1
127.0.0.1:6379> ttl tianqi
(integer) -1# 4.move 将当前数据库的key 移动到给定的数据库db中
# 语法 move key db
# 成功返回1, 失败返回0
# 若key不存在,执行失败;若源数据库和目标数据库有相同的key时,执行失败。
# 默认当前所在的数据库是0
127.0.0.1:6379> move tianqi 1
(integer) 1
127.0.0.1:6379> exists tianqi
(integer) 0
127.0.0.1:6379> select 1     #使用数据库1
OK
127.0.0.1:6379[1]> exists song
(integer) 1# 5.dump 用于序列化给定key,并返回被序列化的值
# 6.expire key second 设置key的过期时间(秒) 过期后将不再可用
#   成功返回1,失败返回0
# 7.ttl 返回给定key的剩余生存时间
#   key不存在返回-2,key存在但没有设置过期时间,返回 -1,否则返回 key的剩余生存时间。* redis2.8以前,前两种情况都返回-1.
# 8.del key 在key存在时删除key 不存在则被hulue
#   返回被删除key的数量
# 9.keys pattern 查找所有符合pattern的key
#   e.g.keys *  查找所有的key
#   返回符合pattern的key列表

String

# 1.append key value
#   如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
#   如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
#   返回追加指定值之后字符串的长度
127.0.0.1:6379> exists my
(integer) 0
127.0.0.1:6379> append my "kuang"
(integer) 5
127.0.0.1:6379> append my "lifang"
(integer) 11
127.0.0.1:6379> get my
"kuanglifang"# 2.strlen key 返回key所存储的字符串值的长度
#   正常返回字符串的长度,当key不存在时,返回0,key存储的不是字符串值时,返回一个错误
# 3.incr/decr key 将key中存储的数字值增/减1
#   若key不存在,那key的值会先初始化为0,再执行操作;若值包含错误的类型,或字符串类型的值不能表示为数字,则返回一个错误。
# 4.incrby key num 将key所存储的值加上给定的增量值num
#   返回的判定与incr相同
# 5.getrange key start end  返回key中字符串值得子字符
127.0.0.1:6379> set mykey "hello,word"
OK
127.0.0.1:6379> getrange mykey 0 5
"hello,"
127.0.0.1:6379> getrange mykey 0 56
"hello,word"
127.0.0.1:6379> getrange mykey 0 -1
"hello,word"# 6.setrange key offset value 用value覆写给定key所存储的字符串值,从offset开始
#   返回被修改后的字符串长度
127.0.0.1:6379> set mykey "hello world"
OK
127.0.0.1:6379> setrange mykey 6 "redis"
(integer) 11
127.0.0.1:6379> get mykey
"hello redis"# 7.setex key timeout value  将value关联到key,并将key的过期时间设为second(秒) 若key已经存在,将会替换旧的值
#   成功返回ok
# 8.setnx key value key不存在时,为key设置指定的值
#   成功返回1,失败返回0
127.0.0.1:6379> exists job
(integer) 0
127.0.0.1:6379> setnx job "programmer"
(integer) 1
127.0.0.1:6379> setnx job "myjob"
(integer) 0
127.0.0.1:6379> get job
"programmer"# 9.mset 设置一个或多个key-value对 总是返回ok
127.0.0.1:6379> mset k1 "hello" k2 "world"
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> get k2
"world"# 10.mget 获取一个或多个给定key的值# 11.msetnx 设置一个或多个key-value对,当且仅当所有给定的key都不存在
#   当所有key都成功设置,返回1,有一个key设置失败,返回0# 12.设置对象
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> keys *1) "user:1:age"2) "user:1"3) "user:1:name"
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"

List

# 一般都以 l开头
127.0.0.1:6379> lpush list one       #在redis2.4之前,都只接收单个value值
(integer) 1                         #返回执行命令后,列表的长度
127.0.0.1:6379> lpush list two       #在表头插入数据
(integer) 2
127.0.0.1:6379> lrange list 0 -1 #获取列表的内容
1) "two"
2) "one"
127.0.0.1:6379> lrange list 0 1      #获取列表指定范围内的元素
1) "two"
2) "one"
127.0.0.1:6379> rpush list right #在表尾插入数据
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> lpop list            #移出并获取列表的第一个元素
"two"
127.0.0.1:6379> rpop list            #移出并获取列表的最后一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "one"
127.0.0.1:6379> lindex list 0        #通过索引获取具体的某个数据
"one"
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list            #获取列表的长度
(integer) 3
127.0.0.1:6379> lpush list three
(integer) 4
# lrem key count value
# count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
# count < 0:从表尾开始向表头搜索
# count = 0:移除表中所有与value相等的值
127.0.0.1:6379> lrem list 1 one      #移除列表元素
(integer) 1                         #返回被移除元素的数量,列表不存在时返回0
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
###############################################################################################
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> ltrim mylist 1 2 #让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> rpoplpush mylist otherlist       #移除列表的最后一个元素,并将该元素添加到另一个列表并返回
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
127.0.0.1:6379> lrange otherlist 0 -1
1) "hello2"
127.0.0.1:6379> exists l
(integer) 0
#############################################################################################
127.0.0.1:6379> lset l 0 item        #通过索引设置列表元素的值 当索引参数超出范围或对一个空列表操作时,返回一个错误,成功返回ok
(error) ERR no such key
127.0.0.1:6379> lpush l value1
(integer) 1
127.0.0.1:6379> lrange l 0 0
1) "value1"
127.0.0.1:6379> lset l 1 other
(error) ERR index out of range
############################################################################################
127.0.0.1:6379> rpush list "hello"
(integer) 1
127.0.0.1:6379> rpush list "world"
(integer) 2
127.0.0.1:6379> linsert list before "world" "other"      #在列表的元素前/后插入元素
(integer) 3                         #若命令执行成功,返回操作完成后列表的长度,若没有找到指定元素,返回-1,若key不存在或为空列表,返回0
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert list after world new
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
# 注意 如果移除了所有值,空链表,也代表不存在

Set

127.0.0.1:6379> sadd myset "hello"                  #向集合添加一个或多个成员 当集合不是集合类型时,返回一个错误
(integer) 1
127.0.0.1:6379> sadd myset "kuangliifang" "love" #redis2.4之前,sadd只接受单个成员值
(integer) 2
127.0.0.1:6379> smembers myset                       #返回集合中的所有成员 不存在的集合key被视为空集合
1) "hello"
2) "love"
3) "kuangliifang"
127.0.0.1:6379> sismember myset hello                #判断member元素是否是集合key的成员
(integer) 1                                         #是 返回1
127.0.0.1:6379> sismember myset world
(integer) 0                                         #不是或key不存在 返回0
127.0.0.1:6379> scard myset                          #获取集合的成员数
(integer) 3                                         #若key不存在 返回0
127.0.0.1:6379> srem myset hello                 #移除集合中一个或多个成员 不存在的成员会被忽略 redis2.4以前只接受单个成员值
(integer) 1                                         #当key不是集合类型,返回一个错误
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "love"
2) "kuangliifang"
127.0.0.1:6379> srandmember myset                    #返回集合中一个或多个随机数
"kuangliifang"
#redis2.6开始,接受可选的count参数
#如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
#如果 count 大于等于集合基数,那么返回整个集合。
#如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
127.0.0.1:6379> srandmember myset 2
1) "kuangliifang"
2) "love"
127.0.0.1:6379> smembers myset
1) "love"
2) "kuangliifang"
127.0.0.1:6379> spop myset                           #移除并返回集合中的一个随机元素
"love"
127.0.0.1:6379> smembers myset
1) "kuangliifang"
127.0.0.1:6379> sadd myset1 "hello"
(integer) 1
127.0.0.1:6379> sadd myset1 "world" "klf"
(integer) 2
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset1 myset2 "klf"          #若源集合不存在指定的member元素,则不执行,仅返回0,若目标集合已经包含member元素,则该命令只是简单的将源集合中的member元素删除。
(integer) 1
127.0.0.1:6379> smembers myset1
1) "world"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "klf"
2) "set2"
127.0.0.1:6379> sdiff myset1 myset2                  #返回集合的差集
1) "hello"
2) "world"
127.0.0.1:6379> sinter myset1 myset2             #返回集合的交集
(empty list or set)
127.0.0.1:6379> sunion myset1 myset2             #返回集合的并集
1) "hello"
2) "world"
3) "set2"
4) "klf"

Hash

更适合于对象的存储,String更加适合字符串存储

127.0.0.1:6379> hset myhash field1 klf                #为字段赋值
(integer) 1                                         #是新建字段并赋值成功
127.0.0.1:6379> hget myhash field
(nil)
127.0.0.1:6379> hget myhash field1
"klf"
127.0.0.1:6379> hset myhash field1 hello         #字段已经存在哈希表中,旧值将被覆盖
(integer) 0                                         #返回0
127.0.0.1:6379> hget myhash field1
"hello"
127.0.0.1:6379> hmset myhash field2 world field3 value       #设置多对值
OK
127.0.0.1:6379> hmget myhash field1 field2 field3            #获取多个值
1) "hello"
2) "world"
3) "value"
127.0.0.1:6379> hmset myhash field2 hello field vue          #若字段已存在则会覆盖旧值
OK
127.0.0.1:6379> hmget myhash field2 field
1) "hello"
2) "vue"
127.0.0.1:6379> hgetall myhash                       #获取所有的键值对
1) "field1"                                           #每个字段名之后是字段的值
2) "hello"
3) "field2"
4) "hello"
5) "field3"
6) "value"
7) "field"
8) "vue"
127.0.0.1:6379> hdel myhash field                    #删除一个或多个指定字段
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "hello"
5) "field3"
6) "value"
127.0.0.1:6379> hlen myhash                          #获取字段的数量
(integer) 3
127.0.0.1:6379> hexists myhash field1                #判断是否存在某个字段
(integer) 1
127.0.0.1:6379> hexists myhash field
(integer) 0
127.0.0.1:6379> hkeys myhash                     #获取哈希表中所有的字段名
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379> hvals myhash                     #获取哈希表中所有字段的值
1) "hello"
2) "hello"
3) "value"
127.0.0.1:6379> hset myhash field4 5
(integer) 1
# 如果哈希表不存在 则会先创建表
# 如果指定的字段不存在 会先将字段的值初始化为0
127.0.0.1:6379> hincrby myhash field4 1
(integer) 6
127.0.0.1:6379> hincrby myhash field4 -1         #增量可以为负数
(integer) 5
127.0.0.1:6379> hsetnx myhash field5 hello           #字段不存在时设置字段的值
(integer) 1
127.0.0.1:6379> hsetnx myhash field5 hel
(integer) 0                                         #若存在且没有操作被执行 则返回0

Zset(有序集合)

127.0.0.1:6379> zadd myzset 1 hello                       #有序集合不存在时,先创建再执行zadd操作
(integer) 1                                             #返回被成功添加的成员个数
127.0.0.1:6379> zadd myzset 2 world 3 klf                #redis2.4以前 zadd每次只能添加一个元素
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "hello"
2) "world"
3) "klf"
127.0.0.1:6379> zcount myzset 1 3                        #计算在有序集合中指定区间分数的成员数
(integer) 3
127.0.0.1:6379> zadd myzset 0 hello                      #某个成员已经是有序集合的成员,就更新这个成员的分数值,并重新插入这个成员
(integer) 0                                             #那些被更新、已经存在的成员被忽略
# 通过分数返回有序集合指定区间内的成员(从小到大)
# 默认情况下,区间的取值使用闭区间(小于等于或大于等于),可通过给参数前增加“(”符号来使用可选的开区间
# zrangebyscore myzset (1 5         返回所有符合条件 1 < score <= 5的成员
127.0.0.1:6379> zrangebyscore myzset -inf +inf withscores       #显示整个有序集合的值并带上score值
1) "hello"
2) "0"
3) "world"
4) "2"
5) "klf"
6) "3"
127.0.0.1:6379> zadd salary 2500 xiaoheng 5000 zhangsan 500 klf
(integer) 3
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "klf"
2) "xiaoheng"
3) "zhangsan"
127.0.0.1:6379> zrevrange salary 0 -1                        #返回有序集合中指定区间内的成员 分数从大到小
1) "zhangsan"
2) "xiaoheng"
3) "klf"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "klf"
2) "500"
3) "xiaoheng"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores            #返回分数小于等于2500的成员
1) "klf"
2) "500"
3) "xiaoheng"
4) "2500"
127.0.0.1:6379> zrem salary xiaoheng                         #移除有序集合中的一个或多个成员 redis2.4以前 每次只能删除一个元素
(integer) 1                                                     #被成功移除的成员数量
127.0.0.1:6379> zrange salary 0 -1
1) "klf"
2) "zhangsan"
127.0.0.1:6379> zcard salary                                 #获取有序集合的成员数
(integer) 2
127.0.0.1:6379> zadd salary 6000 tom
(integer) 0
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "klf"
2) "500"
3) "zhangsan"
4) "5000"
5) "tom"
6) "6000"
127.0.0.1:6379> zrevrank salary tom                              #返回有序集合中成员的排名,从大到小排序,排名以0为底 使用zrank可以获得从小到大排列的排名
(integer) 0

三种特殊数据类型

Geospatial 地理位置

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing                    #将指定的地理空间位置添加到key中
(integer) 1                                                             #返回添加成功的数目,但不包括已更新score的元素
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
127.0.0.1:6379> geopos china:city beijing                            #返回元素的位置
1) 1) "116.39999896287918"2) "39.900000091670925"
127.0.0.1:6379> geopos china:city beijing chongqing
1) 1) "116.39999896287918"2) "39.900000091670925"
2) 1) "106.49999767541885"2) "29.529999579006592"
127.0.0.1:6379> geodist china:city beijing shanghai km                   #返回两个给定位置之间的距离 元素不存在的话返回空值 默认单位是米
"1067.3788"
127.0.0.1:6379> georadius china:city 110 30 1000 km                  #以给定的经纬度为中心,找出某一半径内的元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist              # withdist 将位置元素与中心之间的距离也一并返回
1) 1) "chongqing"2) "341.9374"
2) 1) "xian"2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord         # withcoord  将位置元素的经纬度也一起返回
1) 1) "chongqing"2) 1) "106.49999767541885"2) "29.529999579006592"
2) 1) "xian"2) 1) "108.96000176668167"2) "34.2599996441893"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord withdist count 2                        # count 获取前n个匹配元素
1) 1) "chongqing"2) "341.9374"3) 1) "106.49999767541885"2) "29.529999579006592"
2) 1) "xian"2) "483.8340"3) 1) "108.96000176668167"2) "34.2599996441893"
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km             # 找出位于指定范围内的元素
1) "beijing"
2) "xian"
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

Hyperloglog

127.0.0.1:6379> pfadd h1 foo zap a                                    # 添加指定元素
(integer) 1                                                         # 如果至少有一个元素被添加返回1
127.0.0.1:6379> pfadd h1 zap zap zap
(integer) 0                                                         # 都没添加成功 返回0
127.0.0.1:6379> pfadd h1 zap
(integer) 0
127.0.0.1:6379> pfcount h1                                           # 返回给定Hyperloglog的基数估算值
(integer) 3
127.0.0.1:6379> pfadd h2 a b
(integer) 1
127.0.0.1:6379> pfmerge h3 h1 h2                                 # 将多个Hyperloglog合并为一个 第一个参数为目标Hyperloglog
OK
127.0.0.1:6379> pfcount h3
(integer) 4

Bitmap

Bitmap位图,数据结构,都是操作二进制来进行记录,就只有0和1两个状态

# 使用bitmap来记录 周一到周日的打卡
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit dign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3                    # 查看某一天是否打卡
(integer) 1
127.0.0.1:6379> bitcount sign                    # 统计这周的打卡记录
(integer) 3

事务

Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
Redis事务没有隔离级别的概念
所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行!即 Exec
Redis单条命令式保证原子性,但事务不保证原子性
redis的事务:

  • 开启事务(multi)
  • 命令入队
  • 执行事务(exec)
###########################正常执行事务#################################
127.0.0.1:6379> multi                            # 开启事务
OK
127.0.0.1:6379> set k1 v1                        # 命令入队
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec                         # 执行事务
1) OK
2) OK
3) "v2"
4) OK
###########################放弃执行事务#################################
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard                          # 取消事务
OK
127.0.0.1:6379> get k4                           # 事务中的命令都不会被执行
(nil)
###########################编译型异常##################################
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3                        # 错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> exec                         # 执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4                           # 所有命令不会被执行
(nil)
###########################运行时异常##################################
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1                          # 执行时会失败
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range      # 第一条命令失败 但是其他的依然正常执行成功了
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2
"v2"

监控 (Watch)
悲观锁:

  • 很悲观,认为什么时候都会出问题,无论做什么都会加锁

乐观锁:

  • 很乐观,认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据
  • 获取version
  • 更新的时候比较version
##########################测监视测试###################################
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money                  # 监视 watch对象
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec                     # 事务正常结束,数据期间没有发生变化,这时候就正常执行成功
1) (integer) 80
2) (integer) 20

Redis基础知识——数据类型及其命令相关推荐

  1. Redis基础知识+安装+常用命令使用

    Redis NoSql概述 为什么用NoSql 单机MySQL的时代! 上古90年代,更多的是静态网页,动态交互类型的网站不多.一个基本网站访问量一般不会太大,单个数据库可以轻松应付. 现如今的大数据 ...

  2. Redis(三):Redis基础知识与常用命令

    1.基础命令 Redis默认有16个数据库,用的是第0个数据库,可以使用select进行切换数据库,使用DBSIZE查看DB大小(只针对当前数据库). 使用keys * 查看当前数据库下所有的key, ...

  3. 技术实践|Redis基础知识及集群搭建(上)

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享,希 ...

  4. Redis基础 概念 数据类型 常用指令 Jedis 持久化

    Redis基础 概念 数据类型 常用指令 Jedis 持久化 1. Redis 简介 1.1 NoSQL概念 1.1.1 问题现象 1.1.2 NoSQL的概念 1.2 Redis概念 1.2.1 r ...

  5. Redis基础知识入门

    Redis快速入门 博主关于Redis高级特性的一些讲解,传送地址如下: 删除策略与淘汰策略详解 主从复制详解 哨兵模式详解 集群详解 缓存预热 & 缓存雪崩 & 缓存击穿 & ...

  6. 解析Redis操作五大数据类型常用命令

    摘要:分享经常用到一些命令和使用场景总结,以及对Redis中五大数据类型如何使用cmd命令行的形式进行操作的方法. 本文分享自华为云社区<Redis操作五大数据类型常用命令解析>,作者:灰 ...

  7. C语言基础知识-数据类型

    C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个.1>.数据类型关键字(12个)char,sh ...

  8. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  9. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

最新文章

  1. MinkowskiEngine多GPU训练
  2. IExtensibleObjectExtensibleHttpApplication的性能问题
  3. 计算机主机硬件图片,电脑主机内部有哪些硬件
  4. 谈谈java中的集合框架
  5. stm32基本入门(一)
  6. pandas 字符串切片后保存_Pandas时间序列基础详解(转换,索引,切片)
  7. jquey知识点整理
  8. make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all] 错误 2 解决方法...
  9. L298N电机驱动模块的简单介绍
  10. 【系统分析师之路】系统分析师冲刺习题集(企业信息化)
  11. pdfminer将pdf转为csv
  12. Android实现通话呼叫转移与监听通话录音功能
  13. netware 6.5的故障解决
  14. 结合mahout的数据挖掘算法介绍
  15. 谷歌默认打开hao123
  16. Spring Tools Suite(STS)的下载与安装
  17. html调微信加好友,个人微信加好友的四个实用方法
  18. 【原】群晖btrfs系统修复
  19. 【数据技术】关于HP Vertica MPP列式数据库资源池设置的一点心得
  20. 大一集训--c++ set集合

热门文章

  1. 安卓AlarmManager(闹钟服务)
  2. 从测试和 QA 角度,如何看待 Ant Design 圣诞节彩蛋事件?
  3. C++课程设计,题目:通讯录管理系统
  4. 红外目标模拟器中的高精度可编程TEC半导体温度控制解决方案
  5. linux实验:基于mykernel的一个简单的时间片轮转多道程序内核代码分析
  6. 网络工程师——初步了解
  7. gym102460 2019ICPC台湾L Largest Quadrilateral
  8. android 下载apk并自动安装,Android下载apk并自动安装(兼容Android7.0)
  9. 好文章,《李录:现代化十六讲》
  10. 商派ECmall的支付接口初探(一)