Redis value的5种类型及常见操作
Redis本身存储就是一个hash表,实际实࣫比hash表更复一些,后续讲存储结构时会细讲
Key只有String类型
Value包括String ,Set,List,Hash,Zset五中类型
STRING 可以是字符串,整数或者浮点数以及任何二进制格式的数据 对字符串或一部分进行操作,对整到和浮点数进行自增或自减操作
LIST 一个链表,链表上的每个字节都包含一个字符串 根据偏移量查找或移除某元素
SET 包含字符串的无序收集器,并且包含的每个字符串都不重复 添加,获取,移除单个元素,是否存在,计算交集,差集,并集,从集合中取元素
HASH 包含键值对的无序散列表 添加,获取,删除多个键值对,获取所有键值对
ZSET 字符集成员member和浮点数分值score之间的有序映射,元素的排列顺序由分值的大小决定 添加获取删除单个元素,根据分值范围或成员来获取元素
数据基础结构
string
string SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX代表设置超时时间,单位为秒
• PX代表设置超时时间,单位为毫秒
• NX代表只有key不存在才会执行
• XX代表只有key存在才会更新
• 如果成功,返回ok,失败返回空(nil)
Get key 返回key对应的值
[root@hongquan1 src]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set 123 liubx1122 EX 2 //值存在2秒
OK
127.0.0.1:6379> get 123
(nil)
127.0.0.1:6379> set 123 liubx1122 EX 20
OK
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> get 123
(nil)
127.0.0.1:6379> set 123 liubx1122 EX 2000
OK
127.0.0.1:6379> set 123 liubx3344 NX //不存在就更新
(nil)
127.0.0.1:6379> set 999 liubx3344 NX
OK
127.0.0.1:6379> get 999
"liubx3344"
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> set 123 99878 XX //存在就更新
OK
127.0.0.1:6379> get 123
"99878"
MGET key [key ...]
返回指定的key的所有值,如果key不存在则返回这个key的值为nil
返回对应key的值列表
127.0.0.1:6379> mget tt kk fdata1
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> mget tt kk fdata1 nodata
1) (nil)
2) (nil)
3) (nil)
4) (nil)
MSET key value [key value ...]
设置多个key value,如果某个key以及存在,则用新值覆盖旧值
• 整个操作是原子操作,要么同时成功,要么同时失败
• 如果key存在不想覆盖的话,采用MSETNX命令
• 总是返回ok,此操作不会失败
MSETNX key value [key value ...]
与MSET类似,但是如果只要有一个key存在,则表示结果失败
返回值:1表示设置成功,0表示设置失败
--append
如果key已经存在,并且值是string类型,就把新的值追加到原来值的后面
如果key不存在,就类似set的功能
返回值的字符长度
INCR key
对值进行加一操作,但是只能是值是integer类型才能操作,如果不是就会出错
最大值为64位有符号值
返回值为加完的结果--适合做计数器(原子性)
127.0.0.1:6379> get 888
(nil)
127.0.0.1:6379> append 888 apendtest
(integer) 9
127.0.0.1:6379> get 888
"apendtest"
127.0.0.1:6379> set addt 9.9
OK
127.0.0.1:6379> incr addt
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set addt1 kkk
OK
127.0.0.1:6379> incr addt
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set h1 1
OK
127.0.0.1:6379> incr h1
(integer) 2
127.0.0.1:6379> incr h1
(integer) 3
127.0.0.1:6379> get h1
"3"
DECR key
对值进行减一操作,但是Ց能是值是integer类型才能操作,如果Љ是就会出错
• 如果key不存在,会对此key赋值为0,再做操作
• 操作能操作的数被限制为64位有符号值
• 返回操作后的结果值
DECRBY key decrment
对值进行减法操作,减去decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错
INCRBY key increment
对值进行加法法操作,加上decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错
127.0.0.1:6379> get 111
(nil)
127.0.0.1:6379> decr 111
(integer) -1
127.0.0.1:6379> decr 111
(integer) -2
127.0.0.1:6379> get 111
"-2"
127.0.0.1:6379> decrby 111 1
(integer) -3
127.0.0.1:6379> decrby 111 -1
(integer) -2
127.0.0.1:6379> incrby 111 1
(integer) -1
127.0.0.1:6379> incrby 111 0
(integer) -1
127.0.0.1:6379> incrby 111 -2
(integer) -3
INCRBYFLOAT key increment
与INCRBY规则一样,但是操作的是浮点数,返回操作后的结果值
GETSET key value
原子操作,设置新值的时候,把旧值返回给调用者,如果key已经存在或者key不是String类型就会报错,此命令一般与INCR联合使用
STRLEN key
返回key对应的值的长度,如果值不是string类型,就会报错
127.0.0.1:6379> set fdata 1.5
OK
127.0.0.1:6379> incrbyfloat fdata 2.0
"3.5"
127.0.0.1:6379> incrbyfloat fdata 1.005
"4.505"
127.0.0.1:6379> incrbyfloat fdata 3
"7.505"
127.0.0.1:6379> set fdata1 3
OK
127.0.0.1:6379> incrbyfloat fdata 1.1
"8.605"
127.0.0.1:6379> incr mycounter
(integer) 1
127.0.0.1:6379> getset mycounter "0"
"1"
127.0.0.1:6379> get mycounter
"0"
127.0.0.1:6379> getset mycounter 1
"0"
127.0.0.1:6379> get mycounter
"1"
127.0.0.1:6379> getset mycounter 11
"1"
127.0.0.1:6379> get mycounter
"11"
127.0.0.1:6379> sadd sett 1111
(integer) 1
127.0.0.1:6379> strlen sett
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> set sett abc
OK
127.0.0.1:6379> strlen sett
(integer) 3
GETRANGE key start end
2.0版本前叫做SUBSTR,返回字符串类型值的子串,Start和end的值可以取负数,表示倒数第几个,-1表示最后一个字符
返回区间字符串
GETBIT key offset
可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始
SETBIT key offset value
设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值
Bitcount
可以获得字符串类型键中值是1的二进制位个数
127.0.0.1:6379> set k1 123456
OK
127.0.0.1:6379> get k1
"123456"
127.0.0.1:6379> getrange k1 0 3
"1234"
127.0.0.1:6379> getrange k1 -3 -1
"456"
127.0.0.1:6379> set k2 abcde
OK
127.0.0.1:6379> getrange k2 2 3
"cd"
127.0.0.1:6379> getbit k2 1
(integer) 1
127.0.0.1:6379> getbit k2 3
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> setbit k1 2 0
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 0
127.0.0.1:6379> get k1
"\x1123456"
127.0.0.1:6379> bitcount k1 1
(error) ERR syntax error
127.0.0.1:6379> bitcount k1
(integer) 20
127.0.0.1:6379> bitcount k2
(integer) 17
Lists
----评论
LPUSH key value [value ...]
把所有的值从list的头部插入,如果key不存在就创建一个空的队列,如果key对值的value不是list类型,则会出现错误
元素从左到右依次插入,返回list的长度
LPUSHX key value
从list头部插入一个值,当key不存在时,不会产生插入动作,返回list的长度
LPOP key
移除list的第一个节点,并返回节点数据
127.0.0.1:6379> lpush list1 11 22 33 55 66 11
(integer) 6
127.0.0.1:6379> get list1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpop 3
(nil)
127.0.0.1:6379> lpop list1
"11"
127.0.0.1:6379> lpop list1
"66"
127.0.0.1:6379> lpop list1
"55"
127.0.0.1:6379> lpush list2 data1 data2
(integer) 2
127.0.0.1:6379> lpush list2 data3
(integer) 3
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> lpushx list2 data4
(integer) 4
127.0.0.1:6379> lpushx list3 data2
(integer) 0
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> lpushx list3 data1
(integer) 0
127.0.0.1:6379> lpushx list3 data2
(integer) 0
127.0.0.1:6379> lpushx list3 data3
(integer) 0
127.0.0.1:6379> lpop list3
(nil)
----
127.0.0.1:6379> lrange list1 0 10
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> lpush list1 00
(integer) 4
127.0.0.1:6379> lrange list1 0 10
1) "00"
2) "33"
3) "22"
4) "11"
127.0.0.1:6379> lpop list1
"00"
127.0.0.1:6379> lrange list1 0 10
1) "33"
2) "22"
3) "11"
---
BLPOP key [key ...] timeout
以阻塞的方式从上key面移除并返回第一个值,只移除和返回第一个非空的key
Timeout的单位是秒,如果为0,则表示一直阻塞
只要list的长度为0或者key不存在就会阻塞
当key是多个时,比如blopo key1 key2,则只要有一个key对应的list不是非空,则不会阻塞
返回值依次包含key 弹出的值 阻塞的时长,超时时,如果还没有值可以返回,则返回nil
LLEN key
返回对应key的list中值的数量,如果key不存在或者list为空,则返回0
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> blpop list3 10
(nil)
(10.09s)
127.0.0.1:6379> blpop list3 20
(nil)
(20.06s)
127.0.0.1:6379> blpop list1 10
1) "list1"
2) "33"
127.0.0.1:6379> blpop list1 list2 10
1) "list1"
2) "22"
127.0.0.1:6379> blpop list1 list3 10
1) "list1"
2) "11"
127.0.0.1:6379> llen list1
(integer) 0
127.0.0.1:6379> llen list2
(integer) 4
RPUSH key value [value ...]
把所有的值从list的尾部插入,如果key不存在就创建一个空的队列
如果key对应的value不是list类型,则会出现错误
元素从左到右依次插入,返回list的长度
RPUSHX key value
从list尾部插入一个值,当key不存在时,不会产生插入动作,返回list的长度
RPOP key
移除list的最后一个节点,并返回节点数据或者nil
127.0.0.1:6379> rpush l1 1 3 5 7 9
(integer) 5
127.0.0.1:6379> rpushx l2 1 2 3
(error) ERR wrong number of arguments for 'rpushx' command
127.0.0.1:6379> rpushx l2 1
(integer) 0
127.0.0.1:6379> rpop l1
"9"
127.0.0.1:6379> rpop l1
"7"
BRPOP key [key ...] timeout
类似于blpop
RPOPLPUSH source destination
此操作是一个原子操作
从source对应的key的list里面的尾部移除一个值,并且加入到destination指定的list的头部
如果source的list存在在,则返回nil,但是不会做任何操作
如果source和destination是一样的,则等于把list的尾部数据插入到头部
返回被弹出和插入的数据
BRPOPLPUSH source destination timeout
功能与rpoplpush相似,但是当source为空时,将会进行阻塞
127.0.0.1:6379> lpush source 11 22 33
(integer) 3
127.0.0.1:6379> rpoplpush source dest
"11"
127.0.0.1:6379> llen dest
(integer) 1
127.0.0.1:6379> lpop dest
"11"
127.0.0.1:6379> llen dest
(integer) 0
127.0.0.1:6379> rpoplpush dest source
(nil)
LINDEX key index
返回key指定的队列中位置为index的值
从0开始,负数表示从后面开始算
LINSERT key BEFORE|AFTER pivot value
把value的值插入key对应的list中去,位置在pivot这个值的前面(before)或者后面(after)
如果key不存在,则不会产生任何操作
如果pivot对应的值不存在则返回-1,否则就返回插入后list的长度
LRANGE key start stop
返回一个区间的值,从list的头(左)到尾(右)
如果start大于list的长度,就会返回空
如果stop大于list的长度,则以list最后一个值尾准
127.0.0.1:6379> llen dest
(integer) 0
127.0.0.1:6379> lpush dest 11
(integer) 1
127.0.0.1:6379> lpush dest 22 33
(integer) 3
127.0.0.1:6379> linsert dest before 11 44
(integer) 4
127.0.0.1:6379> lrange dest 0 4
1) "33"
2) "22"
3) "44"
4) "11"
127.0.0.1:6379> linsert dest before 55 66
(integer) -1
127.0.0.1:6379> lrange dest 0 6
1) "33"
2) "22"
3) "44"
4) "11"
LREM key count value
删除值等于value的count个元素
• 如果count大于0,则从头到尾数
• 如果count小于0,则从尾到头数
• 如果count等于0,则删除所有的值等于value的元素
LTRIM key start stop
对key指定的list进行裁剪,即取子集
• 如果start>list的长度或者start>end,将会返回一个空列表,然后导致key被删除
• 如果end大于list的长度,则取list的长度
• 执行完成返回ok
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello"
(integer) 2
127.0.0.1:6379> rpush mylist "foo"
(integer) 3
127.0.0.1:6379> rpush mylist "hello"
(integer) 4
127.0.0.1:6379> lrem mylist -2 "hello"
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "foo"
127.0.0.1:6379> lpush dest 11 22 33 44
(integer) 8
127.0.0.1:6379> ltrim dest 0 2
OK
127.0.0.1:6379> exists dest
(integer) 1
127.0.0.1:6379> lrange dest 0 10
1) "44"
2) "33"
3) "22"
127.0.0.1:6379> llen dest
(integer) 3
127.0.0.1:6379> ltrim dest 5 10
OK
127.0.0.1:6379> exists dest
(integer) 0
127.0.0.1:6379> llen dest
(integer) 0
LSET key index value
修改key对应的list中,位置为index的元素的值为value,当index超过list的返回,将会出现错误
127.0.0.1:6379> rpush my "one"
(integer) 1
127.0.0.1:6379> rpush my "two"
(integer) 2
127.0.0.1:6379> rpush my "three"
(integer) 3
127.0.0.1:6379> lset my 0 "four"
OK
127.0.0.1:6379> lset my -2 "five"
OK
127.0.0.1:6379> lrange my 0 -1
1) "four"
2) "five"
3) "three"
Keys
DEL key [key ...]
删除指定的key,如果key不存在,对此key的操作将会忽略,返回被删除的key
DUMP key
按照rdb的储格式把指定的key的值,序列化并返回给客户端,此序列化值里面不包括ttl信息
序列化的值中包含校验码,不同版本的rdb实࣫可能在差异,所以此处序列化的数据可能不对
Key不存在就返回nil
RESTORE key ttl serialized-value [REPLACE]
把通过dump命令序列化的值再存进去,如果没有带replace,且key已经存在,会出现错误
会检查校验值ͧchecksumͨ,如果不满足会返回错误,成功返回ok
EXISTS key [key ...]
判断key是否存在,如果存在,则返回值加1
从3.03版本开始支持多个key,以前的版本只支持一个
如果key重复,则返回值会重复判断和加1
127.0.0.1:6379> get 123
"99878"
127.0.0.1:6379> get 456
(nil)
127.0.0.1:6379> exists 123 456
(integer) 1
127.0.0.1:6379> exists 123
(integer) 1
127.0.0.1:6379> exists 123 123 456
(integer) 2
EXPIRE key seconds
设置key的超时时间,单位是秒ͺ当达到超时时间后,key会被删除
这个超时时间只能被DEL SET GETSET和*STORE命令修改或者改变,其它命令并不会改变超时设置或者超时时长
可以通过命令PERSIST把超时设置取消
当key被RENAME命令修改后,超时设置的特性还是不会改变
设置成功返回1,key不存在或者超时时间设置失败返回0
127.0.0.1:6379> set tt data1
OK
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> expire tt 10
(integer) 1
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> get tt
(nil)
127.0.0.1:6379> set tt data1
OK
127.0.0.1:6379> expire tt 10
(integer) 1
127.0.0.1:6379> set tt data2
OK
127.0.0.1:6379> get tt
"data2"
127.0.0.1:6379> get tt
"data2"
EXPIREAT key timestamp
设置key的超时时间,与EXPIRE相似,但是设置的是精确时间
设置成功返回1,key不存在或者超时时间设置失败返回0
Keys pattern
返回符合pattern的所有的key,在生产环境尽量少用,除非数据比较少,因为此操作会影响性能
可以用scan或者sets来达到查找key的业务需求
• *代表任意符,?代表单个符,[ae]代码a或者e
• [^e]代表不等于e,[a-d]代表a,b,c,d
127.0.0.1:6379> keys [a-d]
(empty list or set)
127.0.0.1:6379> keys [d-k]
(empty list or set)
127.0.0.1:6379> set a 11
OK
127.0.0.1:6379> set b 22
OK
127.0.0.1:6379> keys [a-d]
1) "b"
2) "a"
127.0.0.1:6379> set c 33
OK
127.0.0.1:6379> set d 44
OK
127.0.0.1:6379> keys [a-d]
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379> keys *
1) "b"
2) "h1"
3) "a"
4) "d"
5) "111"
ttl key
返回key对应的超时时间,还剩余多少时间
如果key不存在,返回-2,如果key还没有设置超时时间,返回-1
pttl key
与ttl能一致,但是返回的是毫秒
127.0.0.1:6379> set dd 111 ex 100
OK
127.0.0.1:6379> ttl dd
(integer) 97
127.0.0.1:6379> pttl dd
(integer) 90940
127.0.0.1:6379> ttl dd
(integer) -2
127.0.0.1:6379> ttl d
(integer) -1
SCAN
cursor [MATCH pattern] [COUNT count]--类似rdbms的分页查询
基于游标的方式返回当前数据库的key,因为每次返回的数据不多,不会阻塞服务器,所以可以在生产环境中使用
Cursor表示的是游标的位置,一般从0开始,返回的数据中第一行代表的就是下一次游标的位置,当返回的下一行游标是
0时,代表本次迭代全部完成ͺ此游标值不是一个连续标准值,比如5,10,15是连续标准
MATCH pattern类似keys中模式一样,返回指定模式的迭代游标
Count代表每次迭ї返回的数据条数,默认是10,但是它只是一个提示,实现时并没有严格保证,实际返回的值可能会
比这个值多一些,但是不会多太多
与keys或者SMEMBERS命令相比,scan返回的结果不稳定,在执行迭代的过程中,如果key发生变化,比如删除或者新
增,则返回的结果可能在一下几个问题:
– 可能会返回重复的key,所以,使用此命令时,业务系统需要判断重复
– 如果在迭代过程中,有key被删除了,但是在迭ї完成前没有被添加进来,则此key并不会出现在迭代中
127.0.0.1:6379> scan 0
1) "22"
2) 1) "b"
2) "h1"
3) "c"
4) "addt"
5) "111"
6) "a"
7) "dest"
8) "sett"
9) "fdata1"
10) "fdata"
127.0.0.1:6379> scan 20
1) "21"
2) 1) "a"
2) "dest"
3) "sett"
4) "fdata1"
5) "fdata"
6) "mycounter"
7) "list2"
8) "source"
9) "my"
10) "999"
127.0.0.1:6379> scan 0 match 1*
1) "22"
2) 1) "111"
127.0.0.1:6379> scan 20 match 1*
1) "21"
2) (empty list or set)
hashes
HSET key field value
Key带表的是一个hash表,field为hash表的key,value为hash表中key对应的value
如果key不存在,则创建一个key及对应的hash表
如果field存在,则把value覆盖原来的值
如果field是新加入,并且设置成功,则返回1ͺ如果field已经存在,成功更新旧值,则返回0
HMSET key field value [field value ...]
与hset类似,但是一次设置多个值,成功返回ok
127.0.0.1:6379> hmset map1 name libux age 33
OK
127.0.0.1:6379> get map1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
127.0.0.1:6379> hlen map1
(integer) 2
127.0.0.1:6379> hsetnx map1 name libux123
(integer) 0
127.0.0.1:6379> hsetnx map1 other nxtest
(integer) 1
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
3) "other"
HSETNX key field value
Key代表的是一个hash表,field为hash表的key,value为hash表中key对应的value
• 当field不存在时才设置
• 如果field不存在,则设置值,返回1ͺ如果field存在,则返回0,不做任何操作
HKEYS key
获取key对应的map的所有key,返回key的列表
HLEN key
获取key对应的map的field的数量
HGET key field
获取某个field的值,Key代表的是一个hash表,field为hash表的keyͺ如果key不存在或者field不存在,返回nil,否则返回值
HMGET key field [field ...]
获取key对应的map的多个值,如果key不存在或者field不存在,返回nil,否则返回值列表
HVALS key
返回key对应的map的所有值列表
HSTRLEN key field
返回field对应的值的长度,当key不存在或者field不存在,则返回0
127.0.0.1:6379> hget map1 name
"libux"
127.0.0.1:6379> hmget map1 name age
1) "libux"
2) "33"
127.0.0.1:6379> hvals map1
1) "libux"
2) "33"
3) "nxtest"
127.0.0.1:6379> hlen map1
(integer) 3
HDEL key field [field ...]
删除key对应的map的field,可以原子性操作删除多个field,返回删除的值的数量
HEXISTS key field
判断key指定的map中是否存在field属性,如果key不存在或者field不存在则返回0,否则返回1
HGETALL key
返回key对应的map的所有key-value对,按照key然后下一行是value的形式展示
127.0.0.1:6379> hmset map1 del1 del1data del2 deldata2
OK
127.0.0.1:6379> hexits map1 del1
(error) ERR unknown command 'hexits'
127.0.0.1:6379> hexists map1 del1
(integer) 1
127.0.0.1:6379> hexists map1 del3
(integer) 0
127.0.0.1:6379> hgetall map1
1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
9) "del2"
10) "deldata2"
127.0.0.1:6379> hdel map1 del2
(integer) 1
127.0.0.1:6379> hgetall map1
1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
HINCRBY key field increment
对field指定的值加上increment,但是值必只是integer类型,范围在64位有符号的数,返回增加后的结果
HINCRBYFLOAT key field increment
对field指定的值加上increment,但是值必只是float类型,范围在64位有符号的数,如果key不存在或者field不存在则返回0,否则返回1
HSCAN key cursor [MATCH pattern] [COUNT count]
与scan类似,但是迭代的是key对应的map里面的值
127.0.0.1:6379> hscan map1 0 count 5
1) "0"
2) 1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
127.0.0.1:6379> hincrby map1 age 2
(integer) 35
127.0.0.1:6379> hget map1 age
"35"
127.0.0.1:6379> hset map1 money 100.1
(integer) 1
127.0.0.1:6379> hincrbyfloat map1 money 18.3
"118.39999999999999999"
127.0.0.1:6379> hget map1 money
"118.39999999999999999"
127.0.0.1:6379> hincrbyfloat map1 money -2.5
"115.89999999999999999"
Redis value的5种类型及常见操作的更多相关文章
- Redis入门很简单之六【Jedis常见操作】
Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...
- Redis的数据类型以及各类型的操作
讲完安装和配置,接下来就是所有数据库的重头戏,数据结构和常用操作的增删改查了 redis是key-value的数据结构,每条数据都是⼀个键值对 键的类型是字符串 注意:键不能重复 值的类型分为五种: ...
- Redis入门教程:特性及数据类型的操作
虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- 架构师养成记--31.Redis的几种类型
String类型 Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比 ...
- Java中有几种类型的流?以及常见的实现类都有哪些?
Java中有几种类型的流?以及常见的实现类都有哪些? 首先应该从两个角度来看: 从输入输出方面来讲: Java中有输入流和输出流 从流的编码方式上来讲: Java中有字节流和字符流 ...
- 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!
转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...
- 跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)
前言 对于Redis而言,很多小伙伴只关注其关键的五大基础类型:string.hash.list.set.sorted set(有序集合),其实还有三种特殊类型在很多应用场景也比较适合使用,分别是:b ...
- SQL及常见的三种类型注释
SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...
随机推荐
- Windows Server 2008 IIS的备份和还原
Windows Server 2008 IIS的备份和还原 当我们服务器系统有大量的站点和虚拟目录的时候,因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果有成百上千个站 ...
- iptable防火墙面试题
第1章 (一)基础口试题 1.1 详述 iptales 工作流程以及规则过滤顺序? 1.防火墙是一层层过滤的.实际是按照配置规则的顺序从上到下,从前到后进行过滤的. 2.如果匹配上了规则,即明确表明是 ...
- 泛型学习第四天——List泛型终结:什么是List泛型,泛型筛选,泛型排序
为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须 ...
- nodejs mysql 创建连接池
用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...
- sql处理数据库锁的存储过程
/*--处理死锁 查看当前进程,或死锁进程,并能自动杀掉死进程 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --邹建 2004.4 ...
- PowerDesigner 学习
1. 创建主键,不能为空,递增列,唯一约束(key 通过唯一索引) 数据库-->根据数据库的改动更新model 或者 根据修改后的model (比如新添加的字段)产生新sql代码 2.powe ...
- windows live writer 设置默认字体
下载 Text Template 插件 设置默认字体添加模版. <p style="padding-bottom: 0px; line-height: 130%; margin-t ...
- os.path.abspath()的作用
语法 os.path.abspath(path) 作用 返回绝对路径 实例 import os print(os.path.abspath(".")) #当前目录的绝对路径 pri ...
- keras中无法下载 https://s3.amazonaws.com/img-datasets/mnist.npz 解决方法
网址:https://s3.amazonaws.com/img-datasets/mnist.npz,由于显而易见的原因,无法访问. npz实际上是numpy提供的数组存储方式,简单的可看做是一系列n ...
- C++循环链表实现约瑟夫退圈(类封装)
node.h #pragma once #include <iostream> #include <iomanip> using namespace std; struct n ...