Redis基本类型,事务

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted
set:有序集合)

(一)String(字符串)

  • string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
  • string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

实例

1、向已经存在的字符串增加内容

127.0.0.1:6379> append name "hello"
(integer) 16     #返回增加后的长度

2、获取字符创的长度

127.0.0.1:6379> strlen name   #获取字符串的长度
(integer) 16

3、字符串的++ --操作

127.0.0.1:6379> set names 0   #设置key值
OK
127.0.0.1:6379> get names     #获取key值
"0"
127.0.0.1:6379> incr names    #key值++操作
(integer) 1
127.0.0.1:6379> incr names 
(integer) 2
127.0.0.1:6379> get names
"2"
127.0.0.1:6379> decr names  #key值--操作
(integer) 1
127.0.0.1:6379> decr names
(integer) 0
127.0.0.1:6379> get names
"0"
127.0.0.1:6379> 

4、字符串设置步长操作

127.0.0.1:6379> get names  #获取当前key值
"10"
127.0.0.1:6379> incrby names 6   #设置步增加6
(integer) 16      #长度为16
127.0.0.1:6379> decrby names 11  #设置步长减少11
(integer) 5      #长度为5
127.0.0.1:6379> 

**5、截取字符串的范围**
127.0.0.1:6379> get name  
"yuanhaodonghello"
127.0.0.1:6379> getrange name 0 10   #截取字符串 0-10
"yuanhaodong"
127.0.0.1:6379> getrange name 0 -1   #0- -1代表截取字符串总长
"yuanhaodonghello"
127.0.0.1:6379> 

6、字符串替换

127.0.0.1:6379> get names
"abcdefg"    #之前的字符串内容
127.0.0.1:6379> setrange names 1 xx  #进行字符串替换
(integer) 7
127.0.0.1:6379> get names  
"axxdefg"   #替换后的内容

7、设置key值及过期时间

127.0.0.1:6379> setex name1 30 "hello"  #设置key值及过期时间30s 
OK
127.0.0.1:6379> ttl name1   #查看Key值剩余时间
(integer) 23

8、key值不存在就创建key,key值存在就更改key值

127.0.0.1:6379> get myname   
"redis"
127.0.0.1:6379> setnx myname "mysql"    #更改key值
(integer) 0
127.0.0.1:6379> 

9、批量取出所有的key

127.0.0.1:6379> keys *   #查看所有的key 
1) "key1"
2) "names"
3) "myname"
4) "name"
127.0.0.1:6379> mget key1 name names myname  #批量取出所以的key
1) "v1hello"
2) "yuanhaodonghello"
3) "axxdefg"
4) "redis"
127.0.0.1:6379> 

10、先get在set

127.0.0.1:6379> getset db redis  #如果不存在这个值,就返回null
(nil)
127.0.0.1:6379> get db  
"redis"
127.0.0.1:6379> getset db mysql   #如果值已经存在就返回当前值并设置新的值
"redis"
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379> 

(二)List(列表)

  • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • list命令前面都加上L

实例

2、添加值到list头部

127.0.0.1:6379> lpush list one    #将一个值添加到列表头部
(integer) 1
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> lrange list 0 1   #获取list 0-1的值
1) "tow"
2) "one"
127.0.0.1:6379> lrange list 0 0   #获取list 第一个值
1) "tow"
127.0.0.1:6379> lrange list 0 -1  #获取list中的所有值
1) "tow"
2) "one"
3) "one"
4) "five"
127.0.0.1:6379> 

3、添加值到list尾部

127.0.0.1:6379> rpush list five   #添加新值到list尾部
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
5) "five"
127.0.0.1:6379> 

4、获取list中的指定值

127.0.0.1:6379> lrange list 0 1   #指定范围获取list中的值
1) "three"
2) "two"
127.0.0.1:6379> 

5、获取list中的所有值

127.0.0.1:6379> lrange list 0 -1   #获取list中的所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> 

6、移除list列表第一个元素

127.0.0.1:6379> lrange list 0 -1   
1) "three"
2) "two"
3) "one"
4) "four"
5) "five"
127.0.0.1:6379> lpop list    #移除list列表第一个元素
"three"

7、移除list列表最后一个元素

127.0.0.1:6379> rpop list  #移除list列表最后一个元素
"five"
127.0.0.1:6379>

8、通过下标获取list列表中的某个值

127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> 

9、获取list总长度

127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379> 

10、list中可以存在重复值

127.0.0.1:6379> lpush list one 
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "one"
4) "four"

11、移除list中的指定值

127.0.0.1:6379> lrem list 2 one  #移除list列表中的两个one 
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "four"
127.0.0.1:6379> 

12、ltrim截取指定长度

127.0.0.1:6379> lpush list "r1"
(integer) 1
127.0.0.1:6379> lpush list "r2"
(integer) 2
127.0.0.1:6379> lpush list "r3"
(integer) 3
127.0.0.1:6379> ltrim list 1 2    #通过下标截取指定长度
OK
127.0.0.1:6379> lrange list 0 -1  #查看截取后的list列表
1) "r2"
2) "r1"
127.0.0.1:6379> 

13、移除列表中的最后一个元素,并将它移动到新的列表中

127.0.0.1:6379> lrange list 0 -1   #查看列表中的所有元素
1) "r2"
2) "r1"
127.0.0.1:6379> rpoplpush list mylist  #移除列表中的最后一个元素并移动到新列表
"r1"
127.0.0.1:6379> lrange list  0 -1    #查看原来的列表
1) "r2"
127.0.0.1:6379> lrange mylist 0 -1   #查看新的列表
1) "r1"
127.0.0.1:6379> 

14、linsert将某个具体的value插入到某个列表的前面或后面

127.0.0.1:6379> lrange list  0 -1   #查看当前list中的所有值
1) "r2" 
127.0.0.1:6379> linsert list before "r2" "r3"  #将r3插入到r2前面
(integer) 2
127.0.0.1:6379> lrange list  0 -1
1) "r3"
2) "r2"
127.0.0.1:6379> linsert list after "r3" "r4"  #将r4插入到r3后面
(integer) 3
127.0.0.1:6379> lrange list  0 -1   #再次查看list中的值
1) "r3"
2) "r4"
3) "r2"
127.0.0.1:6379> 

(三)Set(集合)

  • Redis 的 Set 是 string 类型的无序集合,存储的值不能重复!!。

  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

实例

2、向set中添加元素

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> sadd myset "y1"    #向set中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "y2"
(integer) 1
127.0.0.1:6379> sadd myset "y3"
(integer) 1

3、查看set中的所有元素

127.0.0.1:6379> smembers myset   #查看set中的所有元素
1) "y3"
2) "y2"
3) "y1"

4、查看set中是否存在指定元素

127.0.0.1:6379> sismember myset y1   #查看set中是否存在指定元素
(integer) 1
127.0.0.1:6379> sismember myset yy
(integer) 0
127.0.0.1:6379> 

5、获取set集合中的元素个数

127.0.0.1:6379> scard myset   #获取set集合中的元素个数
(integer) 3
127.0.0.1:6379>

6、移除set中的某一元素

127.0.0.1:6379> srem myset y3    #移除set中的y3
(integer) 1
127.0.0.1:6379> smembers myset
1) "y2"
2) "y1"
127.0.0.1:6379> 

7、随机删除set中的元素

127.0.0.1:6379> smembers myset   #查看set中的所有元素
1) "y2"
2) "y1"
127.0.0.1:6379> spop myset     #随机删除set集合中的某个元素
"y2"
127.0.0.1:6379> smembers myset   #查看set中的元素
1) "y1"
127.0.0.1:6379> 

8、指定元素移动到另一个set集合中

127.0.0.1:6379> smembers myset
1) "y2"
2) "y1"
127.0.0.1:6379> smove myset myset2 "y2"   #将myset中的y2移动到myset2中
(integer) 1
127.0.0.1:6379> smembers myset
1) "y1"
127.0.0.1:6379> smembers myset2
1) "y2"
127.0.0.1:6379> 

9、set数字集合类(微博,B站的共同关注)差集,并集,交集

127.0.0.1:6379> sadd mylist "a"   #向mylist中添加元素
(integer) 1
127.0.0.1:6379> sadd mylist "b"
(integer) 1
127.0.0.1:6379> sadd mylist "c"
(integer) 1
127.0.0.1:6379> sadd mylist2 "c"  #向Mylist2中添加元素
(integer) 1
127.0.0.1:6379> sadd mylist2 "d"
(integer) 1
127.0.0.1:6379> sadd mylist2 "e"
(integer) 1
127.0.0.1:6379> sdiff mylist mylist2  #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter mylist mylist2  #交集
1) "c"
127.0.0.1:6379> sunion mylist mylist2  #并集
1) "c"
2) "d"
3) "b"
4) "a"
5) "e"
127.0.0.1:6379> 

(四)Hash(哈希)

  • Redis hash 是一个键值(key=>value)对集合。

  • Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

实例

1、设置key value

127.0.0.1:6379>  hset myhash name yuanhaodong 
(integer) 1

2、通过key获取value

127.0.0.1:6379> hget myhash name
"yuanhaodong"

3、设置多个key value

127.0.0.1:6379> hmset myhash name hello name1 world
OK

4、获取指定的key value

127.0.0.1:6379> hmget myhash name name1
1) "hello"
2) "world"
127.0.0.1:6379> 

5、获取所有的key value

127.0.0.1:6379> hgetall myhash
1) "name"
2) "hello"
3) "name1"
4) "world"
127.0.0.1:6379> 

6、删除指定的key value

127.0.0.1:6379> hgetall myhash   #获取所有的key value 
1) "name"
2) "hello"
3) "name1"
4) "hello"  
127.0.0.1:6379> hdel myhash name1   #删除指定的key
(integer) 1
127.0.0.1:6379> hgetall myhash    #再次查看key value 
1) "name"
2) "hello"
127.0.0.1:6379> 

7、获取所有的hash表的字段长度

127.0.0.1:6379> hlen myhash
(integer) 2

8、获取hash中指定字段是否存在

127.0.0.1:6379> hexists myhash name
(integer) 1

9、只获取所有的key

127.0.0.1:6379> hkeys myhash
1) "name"
2) "name1"

10、获取所有的value

127.0.0.1:6379> hvals myhash
1) "hello"
2) "zhangsan"

11、hash的 ++ --操作

127.0.0.1:6379> hincrby myhash name 3  #指定增量
(integer) 8

12、hash指定值

127.0.0.1:6379> hsetnx myhash name3 hello   #如果值不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash name3 world   #如果值存在则不可以设置
(integer) 0

(五)zset(sorted set:有序集合)

  • Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • zset的成员是唯一的,但分数(score)却可以重复。

实例

1、向zset中添加元素

127.0.0.1:6379> zadd myset 1 one     #添加一个元素
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three    #添加多个元素
(integer) 2
127.0.0.1:6379> zrange myset 0 -1      #输出元素
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>

2、从小到大排序

127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "yhd"
2) "xiaohong"
3) "zhangsan"

3、根据工资进行排序(从小到大)

127.0.0.1:6379> zadd salary 2500 xiaohong     #添加用户
(integer) 1
127.0.0.1:6379> zadd salary 2800 zhangsan 
(integer) 1
127.0.0.1:6379> zadd salary 500 yuanhaodong
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf   #升序排序
1) "yuanhaodong"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> 


127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "yuanhaodong"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "2800"
127.0.0.1:6379>

4、查询工资2500以下的员工升序排序

127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores
1) "yhd"
2) "500"
3) "xiaohong"
4) "2500"

5、移除元素

127.0.0.1:6379> zrange salary 0 -1    #查询所有元素
1) "yhd"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong   #移除元素xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1    #再次查看移除后的元素
1) "yhd"
2) "zhangsan"

6、获取有序集合中的个数

127.0.0.1:6379> zcard salary
(integer) 2

7、从大到小排序

127.0.0.1:6379> zrevrange salary 0 -1
1) "zhangsan"
2) "yhd"

8、获取指定区间的集合数量

127.0.0.1:6379> zadd myset 1 hello   #向集合中添加元素
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 yuanhaodong
(integer) 2
127.0.0.1:6379> zcount myset 1 2    #获取区间 [1,2]的数量
(integer) 2

Redis事务

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

事务的执行的三个阶段

  • 开始事务
  • 命令入队
  • .执行事务

实例

1、开启事务

127.0.0.1:6379> multi
OK

2、命令入队

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

3、开启事务(exec)

127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"

4、放弃事务

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> discard   #放弃最后一个事务
OK
127.0.0.1:6379> get k3
(nil)

5、事务不能正常执行的情况

1)编译型异常

127.0.0.1:6379> multi    #开启事务
OK
127.0.0.1:6379(TX)> set k1 v1   #事务入队
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> getset k3   #错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec   #执行事务,事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4     #其他的命令都没有被执行
(nil)
127.0.0.1:6379> 

2)运行时异常

127.0.0.1:6379> set k1 v1   #设置key value
OK
127.0.0.1:6379> multi     #开启事务
OK
127.0.0.1:6379(TX)> incr k1   #k1执行++操作
QUEUED
127.0.0.1:6379(TX)> set k2 v2   #事务入队
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)>  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"
127.0.0.1:6379> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值