redis 学习(常用命令及demo)

Wesley13
• 阅读 582

redis

NOSQL 介绍:
是一项全新的数据库革命性运动,是一个非关系型数据库,在超大规模和高并发的SNS类型网站中应用广泛。
NoSql是以key-value形式存储,特点是:非关系型、分布式、开源的水平可扩展。
特点优势:

  • 处理超大量数据
  • 运行在便宜pc集群上
  • 击碎了性能瓶颈

应用场景:
1. 对数据高并发读写
2. 对海量数据的高效率存储和访问
3. 对数据的高可扩展性和高可用性

redis

Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs.
redis是一个开源的,先进的key-value缓存存储。它常作为缓存数据库,键可包含字符串、哈希、链表、集合(有序&无序)

支持 push/pop add/move 以及集合的操作,数据保存在内存中,会周期写入硬盘中。

redis数据类型:
string hash list set zset

string是最简单的类型,一个key对应一个value,string类型是二进制安全的。redis的string可以包括任何数据,比如jpg或者序列化的对象。

String类型:

1.设置key的value(set)

    127.0.0.1:6379> set key pm
    OK
    127.0.0.1:6379> get key
    "pm"
    127.0.0.1:6379> 

2.如果不存在设置(setnx)

    127.0.0.1:6379> setnx key df
    (integer) 0
    127.0.0.1:6379> get key
    "pm"

3.设置键的有效期(setex 10s有效期)

    127.0.0.1:6379> setex key 10 value
    OK
    127.0.0.1:6379> get key
    "value"
    127.0.0.1:6379> get key
    (nil)
    127.0.0.1:6379>

4.设置替换(setrange)

127.0.0.1:6379> set key pmx@gmail.com
OK
127.0.0.1:6379> get key
"pmx@gmail.com"
127.0.0.1:6379> setrange key 4 qq
(integer) 13
127.0.0.1:6379> get key
"pmx@qqail.com"
127.0.0.1:6379>

5.一次性设置多个key(mset)

127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
127.0.0.1:6379> 

6.如果不存在设置(msetnx),如果有一个不成功(已存在),全部失效。

127.0.0.1:6379> msetnx key4 value4 key5 value5
(integer) 0
127.0.0.1:6379> 

7.获得旧值并设置新值

127.0.0.1:6379> get key4
"value4"
127.0.0.1:6379> getset key4 kkkk
"value4"

8.截取字符并返回(getrange)

127.0.0.1:6379> get key
"pmx@qqail.com"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> getrange key 0 2
"pmx"
127.0.0.1:6379>

9.批量返回数据(mget)

127.0.0.1:6379> mget key1 key2 kye3

10.递增/递减(incr incrby/decr decrby)

127.0.0.1:6379> incrby key 10
(integer) 11
127.0.0.1:6379> incrby key 10
(integer) 21

11.追加value & 查看字符串长度

127.0.0.1:6379> append key 10
(integer) 4
127.0.0.1:6379> get key
"2110"
127.0.0.1:6379> strlen key
(integer) 4
127.0.0.1:6379> 

2.hashes类型:

hash一个string类型的field和value的映射表。它的添加、删除操作都是O(1),特别适合存储对象。

1.设置hash field(hset)

127.0.0.1:6379> hset user:001 name pmx
(integer) 1

2.如果不存在设置(hsetnx)与setnx类似

127.0.0.1:6379> hsetnx user:001 name mm
(integer) 0
127.0.0.1:6379> hget user:001 name
"pmx"

3.批量设置多个field、得到多个field(hmset,hmget)

127.0.0.1:6379> hmset user:001 name mx age 17
OK
127.0.0.1:6379> hget user:001 name
"mx"
127.0.0.1:6379> hmget user:001 name age
1) "mx"
2) "17"

4.给指定hash field加上固定值(hincrby)

127.0.0.1:6379> hincrby user:001 age 8
(integer) 25

5.判断field是否存在(hexists)得到field个数(hlen)删除field

127.0.0.1:6379> hexists user:001 age
(integer) 1
127.0.0.1:6379> hlen user:001
(integer) 2
127.0.0.1:6379> hdel user:001 age
(integer) 1
127.0.0.1:6379> hlen user:001
(integer) 1

6.得到hash的所有 字段 & 值 &得到所有(hkeys & hvals & hgetall)

127.0.0.1:6379> hmset user:002 key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> hkeys user:002
1) "key1"
2) "key2"
3) "key3"
127.0.0.1:6379> hvals user:002
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> hgetall user:002
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "value3"

3.list类型

1.左压栈(lpush)右压栈(rpush) 左出栈(lpop)右出栈(rpop)(可以作队列用)插入(linsert)

127.0.0.1:6379> lpush mystack world
(integer) 1
127.0.0.1:6379> lpush mystack hello
(integer) 2
127.0.0.1:6379> lpop mystack
"hello"
127.0.0.1:6379> lpop mystack
"world"
127.0.0.1:6379> lpush mystack hello
(integer) 1
127.0.0.1:6379> lpush mystack world
(integer) 2
127.0.0.1:6379> rpop mystack
"hello"
127.0.0.1:6379> rpop mystack
"world"
127.0.0.1:6379> lpush mystack kkkk
(integer) 1
127.0.0.1:6379> linsert mystack before kkkk jjjj
(integer) 2
127.0.0.1:6379> lrange mystack 0 -1
1) "jjjj"
2) "kkkk"
127.0.0.1:6379> 

2.设置list中指定下标的元素值(lset)(仿数组)删除(lrem)
注:lrem n value n<0时 从尾删除,n=0时全部删除

127.0.0.1:6379> lrange mystack 0 -1
1) "jjjj"
2) "kkkk"
127.0.0.1:6379> lset mystack 0 mmmm
OK
127.0.0.1:6379> lrange mystack 0 -1
1) "mmmm"
2) "kkkk"
127.0.0.1:6379> lrange mystack 0 -1
1) "one"
2) "one"
3) "one"
4) "mmmm"
5) "kkkk"
127.0.0.1:6379> lrem mystack 2 one
(integer) 2

3.保留指定key的值范围内的数据(ltrim)

127.0.0.1:6379> lrange mystack 0 -1
1) "jjjj"
2) "mmmm"
3) "kkkk"
127.0.0.1:6379> ltrim mystack 1 -1
OK
127.0.0.1:6379> lrange mystack 0 -1
1) "mmmm"
2) "kkkk"
127.0.0.1:6379> 

4.从第一个list尾部移除元素并添加第二个list的头部(rpoplpush)

127.0.0.1:6379> rpoplpush mystack mystack1
"kkkk"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> lrange mystack 0 -1
1) "mmmm"
127.0.0.1:6379> lrange mystack1 0 -1

5.返回名称为key的list中index位置的元素(lindex)

127.0.0.1:6379> lrange mystack 0 -1
1) "ssdsd"
2) "kkld"
3) "mmmm"
127.0.0.1:6379> lindex mystack 2
"mmmm"

6.返回key对应list的长度(llen)

127.0.0.1:6379> llen mystack
(integer) 3

4.sets类型

set是集合,string类型的无序集合, set是通过hash table实现的,添加、删除和查找的复杂度都是O(1)。对集合可以取并集、交集、查集。sns好友推荐取差集推荐。

1.向集合中添加元素。(sadd)查看集合元素(smembers)

127.0.0.1:6379> sadd myset one
(integer) 1
127.0.0.1:6379> sadd myset two
(integer) 1
127.0.0.1:6379> sadd myset one
(integer) 0
127.0.0.1:6379> smembers myset
1) "two"
2) "one"

2.删除集合中元素(srem)

127.0.0.1:6379> srem myset one
(integer) 1

3.随机返回并删除一个元素(spop)

127.0.0.1:6379> smembers myset
1) "two"
2) "three"
3) "one"
127.0.0.1:6379> spop myset
"one"

4.返回两个集合的差集(sdiff)以第一个为标准(可以做sns好友推荐)

127.0.0.1:6379> smembers myset
1) "two"
2) "three"
127.0.0.1:6379> smembers myset1
1) "two"
2) "lll"
3) "kkk"
127.0.0.1:6379> sdiff myset myset1
1) "three"
127.0.0.1:6379> sdiff myset1 myset2
1) "two"
2) "lll"
3) "kkk"

5.返回两个集合的差集并存储(sdiffstore)

127.0.0.1:6379> sdiffstore myset2 myset1 myset
(integer) 2

6.返回所有给定key的交集(sinter)以及存储(sinterstore)

127.0.0.1:6379> sinter myset1 myset2
1) "lll"
2) "kkk"
127.0.0.1:6379> sinter myset1 myset2 myset
(empty list or set)
127.0.0.1:6379> sinterstore myset4  myset1 myset2
(integer) 2
127.0.0.1:6379> smembers myset4
1) "lll"
2) "kkk"

7.返回所有给定key的并集(sunion)以及存储(sunionstore)

127.0.0.1:6379> sadd myset1 myset1
(integer) 1
127.0.0.1:6379> sadd myset2 myset2
(integer) 1
127.0.0.1:6379> sunionstore myset myset1 myset2
(integer) 2
127.0.0.1:6379> smembers myset
1) "myset2"
2) "myset1"
127.0.0.1:6379> 

8.从第一个key对应的set中移除member并添加到第二个set中(smove)

127.0.0.1:6379> smove myset1 myset2 myset1
(integer) 1
127.0.0.1:6379> smembers myset1
(empty list or set)
127.0.0.1:6379> smembers myset2
1) "myset2"
2) "myset1"

9.返回名称为key集合中元素的个数(scard)判断某元素是否为集合元素(sismember)

127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "myset2"
2) "myset1"
127.0.0.1:6379> sismember myset myset
(integer) 0
127.0.0.1:6379> sismember myset myset1
(integer) 1

10.随机删除名称为key的set的一个元素,不删除(srandmember)

127.0.0.1:6379> srandmember myset
"myset1"
127.0.0.1:6379> srandmember myset
"myset2"
127.0.0.1:6379> srandmember myset
"myset2"

5.有序结合(zset)

sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加元素时可以指定,每次指定后,zset会自动重新按照新的值调整顺序。

1.向有序集合中添加元素(zadd)

127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 two
(integer) 0
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
  1. 删除名称为key的zset中元素的member(zrem)

    127.0.0.1:6379> zrem myset one (integer) 1 127.0.0.1:6379> zrange myset 0 -1

    1. "two"

3.如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment(zincrby)

127.0.0.1:6379> zincrby myset 2 one
"4"
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "two"
2) "3"
3) "one"
4) "4"
127.0.0.1:6379> zincrby myset -2 one
"2"

4.返回名称为key的zset中member元素的排名(按score从小到大排序[下标]值)(zrank)以及反转(zrevrank)降序

127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "2"
3) "two"
4) "3"
127.0.0.1:6379> zrank myset two
(integer) 1
127.0.0.1:6379> zrevrank myset one
(integer) 1
  1. zrangebyscore

    127.0.0.1:6379> zrangebyscore myset 2 2 withscores

    1. "one"
    2. "2"

6.返回集合中score在给定区间的数量(zcount)

127.0.0.1:6379> zcount myset 2 5
(integer) 2

7.返回集合中元素个数

127.0.0.1:6379> zcount myset 2 5
(integer) 2

8.返回集合中所有元素个数(zcard)

127.0.0.1:6379> zcard myset
(integer) 2

9.删除集合中排名在给定区间的元素(zremrangebyrank)(zremrangebyscore)

127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "2"
3) "two"
4) "3"
5) "five"
6) "5"
127.0.0.1:6379> zremrangebyrank myset 2 2
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
127.0.0.1:6379> zremrangebyscore myset 2 2
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "two"

键值相关命令:

1.keys * 得到所有键

2.exists 是否存在键

3.del 删除key

  1. expire 设置一个key过期时间(ttl查看过期时间)移除key的过期时间(persist)

    127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> 127.0.0.1:6379> expire age 10 (integer) 1 127.0.0.1:6379> ttl age (integer) 8 127.0.0.1:6379> ttl age (integer) -2 127.0.0.1:6379> get age (nil) 127.0.0.1:6379[1]> set age 20 OK 127.0.0.1:6379[1]> expire age 20 (integer) 1 127.0.0.1:6379[1]> persist age (integer) 1

5.移动数据库

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> move age 1
(integer) 1
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get age
"20"

6.随机返回一个key(randomkey)

127.0.0.1:6379> randomkey
"posts:count"
127.0.0.1:6379> randomkey
"post:43"
127.0.0.1:6379> randomkey
"post:content"

7.重命名key(rename )

127.0.0.1:6379> rename key2 key_new
OK

8.返回值的类型(type)

127.0.0.1:6379> type post
string
127.0.0.1:6379> type car
hash
127.0.0.1:6379> type list
none
127.0.0.1:6379> type myset
zset
127.0.0.1:6379> type mylist
list

9.测试服务是否存活 (ping) 打印显示 (echo)退出(quit)

127.0.0.1:6379> ping
PONG

10.返回当前数据库中key的数目(dbsize)服务器信息(info)

127.0.0.1:6379> dbsize
(integer) 22
127.0.0.1:6379> info
# Server
redis_version:3.0.0
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3946449f969be394
redis_mode:standalone

11.实时存储收到的请求(config get [*] )

12.删除当前选择数据库中的所有key(flushdb)

13.清除所有数据库所有key(flushall)

redis高级应用

1.安全性(设置连接密码,尽量复杂,放置暴力破解,[每分钟可达到150w次密码尝试])
1.在redis.conf中设置requirepass 123456
2.redis-cli 中连接1. ./redis-cli -a 123456 2. ./redis-cli –>auth

2.主从复制
1.redis主从复制特点
1.Master可以复制多个slave
2.多个slave可以连接同一个master,还可以连接其他slave
3.主从复制不会阻塞master,在同步数据时,master可以继续处理client。
4.提高系统的伸展性
2.配置主从服务器:
1.在slave中redis.conf开启slaveof 192.168.1.1 6379
2.masterauth 123456
3.info 查看主从(role)
3. 事务处理(multi)不回滚
1.开启事务multi
2.取消事务discard
[注]乐观锁:大多数是基于数据版本的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个version字段来实现读取数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应纪录的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为过期数据。[版本控制器]

3.持久化机制
redis是一个支持持久化的内存数据库,redis需要经常讲内存中的数据库同步到硬盘来保持持久化。
redis持久化有两种:

1.snapshootting(快照,默认dump.rdb,数据)
save 900 1 #900秒如果超过1个key被修改,发起快照保存
save 300 10 #300秒内容如超过10个key被修改,发起保存快照
2.append-only file(缩写aof,操作)

    appendonly yes//启用aof模式
    #appendfsync always //收到写命令立即写入磁盘,完全持久话 
    appendonly everysec//每秒写入磁盘一次,在性能上折中
    #appendfsync no//依赖os 性能最好,持久化没保证

3.发布与订阅消息(publish & subscribe)

client 1
127.0.0.1:6379> subscribe tv1
client 2
127.0.0.1:6379> subscribe tv1

client 3
127.0.0.1:6379> publish tv1 qwe
(integer) 2

127.0.0.1:6379> subscribe tv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
1) "message"
2) "tv1"
3) "qwe"

4.虚拟内存的使用
redis的虚拟内存和操作系统虚拟内存不一样,是把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。

1.配置
vm-enabled yes #开启vm功能
vm-swap-file /tmp/redis.swap #交换出来的value保存文件路径
vm-max-memory 100000 #redis使用最大内存上线
vm-page-size 32 #每个页面大小32字节
vm-pages 134217728 #最多使用多少页面
vm-max-threads 4 #用于执行value对象换入的工作线程数量

really-use-vm yes

版权声明:本文为博主原创文章,未经博主允许不得转载。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这