如何用redis来生成唯一Id

如何用redis来生成唯一Id,第1张

1、首先你要制定好你的id规则,比如年月日+序列

2、按照上面的规则,你只需要保证序列自增即可

3、利用redis的string类型,incr my_sequeue,mysequeue会从1开始自增

4、最终生成如:201711131、201711132、201711133这样的序列

5、如果你要按年内或者月内自增,就需要设置my_sequeue的过期时间,保证下一月或者下一年从1开始

一 单机安装

解压redis

进入文件夹执行mke and make install

1

2

# prefix指定安装路径

make && make prefix=/opt/hjf/redis-2818 install

配置环境变量

以后自动打开redis服务

进入解压包的utils目录, 执行:

1

/install_serversh

进入redis服务器:

1

redis-cli

二shell命令

1 strings

1 set:设置

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX: 过期时间(秒)

PX: 过期时间(毫秒)

NX: 键不存在时, 才能设置(只能创建, 不能修改)

XX: 键存在时, 才能设置(只允许修改, 不允许创建)

普通模式

1

2

# 默认永久保存

set k1 aa

设置生命周期

1

2

# 5s后自动删除

set k3 c ex 5

过时后就获取不了了

只允许创建, 不允许修改

1

2

# 相当于: setnx k4 abc

set k4 abc nx

只允许修改, 不允许创建

1

set k5 123 xx

2 get:获取

GET key

1

get k1

3 keys: 获取key列表

KEYS pattern

1

2

keys

keys k

4 setnx: 如果key不存在,则执行

SETNX key value

相当于只允许创建,而不允许修改。

1

2

setnx k3 5

set k3 5 nx #等价

5 strlen 获取长度:

STRLEN key

1

strlen k6

6 清空库

flushall 清空所有库的数据

1

flushall

flushdb: 清空当前库数据:

1

flushdb

7 expire 设置过期时间:

EXPIRE key seconds

1

expire k1 5

8 type: 查看key的类型

1

TYPE key

虽然所有的数据类型都是以“string”存储,但是有属性加一区别:

9 自增/自减

incr / incrby: 增加

INCR key: 自增+1

INCRBY key num: 自增 + num

decr / decrby:减少

DECR key: 自减 - 1

INCRBY key num: 自减 - num

注意: 在遇到数值 *** 作时,redis会将字符串类型转换成数值

由于INCR等指令本身就具有原子 *** 作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的 *** 作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。

10 getset 返回旧值,并设置新的值:

GETSET key value

11 append: 追加

APPEND key value

12 getrange获取子字符串

GETRANGE key start end

2 集合:

1 无序集合

sadd: 创建集合

1

sadd set1 s1 s2 s3 s2 s4 s1

smembers: 读取集合元素

1

smembers set1

sismember : 判断元素是否在集合中

如果在, 则返回1; 如果不在, 则返回0

1

sismember set1 "one"

srandmember : 随机获取集合元素

1

srandmember set1

mset:同时设置多组key-value

MSET key value [key value …]

1

mset key1 value1 key2 value2

sdiff: 差集

1

sdiff num1 num2

交集:sinter

1

sinter num1 num2

并集:sunion

1

sunion num1 num2

2 有序集合

zadd: 添加元素

ZADD key score member [score member …]

1

2

zadd set2 1 one

zadd set2 2 two 3 three 4 four 5 five

zrange: 获取元素

获取所有元素

1

zrange set2 0 -1

获取指定范围内的元素

1

zrange set2 2 4

列出所有元素,同时列出其位置

1

zrange set2 0 -1 withscores

3 哈希

hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。

hmset: 建立哈希,并赋值

1

hmset user1 user zhangsan age 20 gender m

hgetall: 列出哈希的内容

1

hgetall user1

hget: 获取哈希中的某一个值

1

hget user1 age

hset: 更改哈希中的某一个值

1

hset user1 user lisi

hkeys: 获取key列表

1

hkeys user1

hvals: 获取value列表

1

hvals user1

4 列表

lpush: 向列表头部(左侧)插入元素, 返回当前列表元素个数

1

2

lpush l1 a

lpush l1 b c

rpush: 向列表尾部(右侧)插入元素, 返回当前列表元素个数

1

2

rpush l1 c

rpush l1 d

lrange: 获取列表元素

1

2

3

4

# 获取编号0到倒数第一个元素

lrange l1 0 -1

# 获取编号0到编号2的

lrange l1 0 2

rpop: d出列表尾部(右侧)的元素

1

rpop l1

lpop: d出头部(左侧)的元素

1

lpop l1

lrem : 删除指定值

LREM key count value

如果count < 0, 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。

如果count > 0, 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。

如果count = 0, 移除表中所有与 VALUE 相等的值。

1

lrem l3 -2 a

1

lrem l3 -2 c

1

lrem l3 0 b

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。

Redis能运行在大多数POSIX(Linux, BSD, OS X 和Solaris等)系统上,官方没有支持Windows的版本。目前最新的版本是2211,这个版本主要是修复了一个227版本中遍历方式优化带来的一个bug。

和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。

Redis的数据都保存在内存中,而且底层实现上是自己写了epoll event loop部分,而没有采用开源的libevent等通用框架,所以读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。

1、数据类型

作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis的键值还可以是以下形式之一:

●Lists (列表)

●Sets (集合)

●Sorted sets (有序集合)

●Hashes (哈希表)

键值的数据类型决定了该键值支持的 *** 作。Redis支持诸如列表、集合或有序集合的交集、并集、查集等高级原子 *** 作;同时,如果键值的类型是普通数字,Redis则提供自增等原子 *** 作。

2、持久化

通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。

3、主从同步

Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。

4、性能

相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给Redis带来了非常优秀的性能。读写 *** 作之间有显著的性能差异。

5、提供API的语言

●C

●C++

●C#

●Clojure

●Common Lisp

●Erlang

●Haskell

●Java

●Javascript

●Lua

●Objective-C

●Perl

●PHP

●Python

●Ruby

●Scala

●Go

●Tcl

6、适用场合

毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据 *** 作,为不同的大象构建不同的冰箱。希望你喜欢这个比喻。

下面是Redis适用的一些场景:

(1)、取最新N个数据的 *** 作

比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取。

使用LPUSH latestcomments命令,向list集合中插入数据

插入完成后再用LTRIM latestcomments 0 5000命令使其永远只保存最近5000个ID

然后我们在客户端获取某一页评论时可以用下面的逻辑

FUNCTION get_latest_comments(start,num_items):

id_list = redislrange("latestcomments",start,start+num_items-1)

IF id_listlength < num_items

id_list = SQL_DB("SELECT ORDER BY time LIMIT ")

END

RETURN id_list

END

如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的。

二者数据同步的关键在于mysql数据库中主键,方案是在redis启动时区mysql读取所有表键值存入redis中,往redis写数据是,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。

参考代码如下:

String tbname = "login";

//获取mysql表主键值--redis启动时

long id = MySQLgetID(tbname);

//设置redis主键值--redis启动时

redisServiceset(tbname, StringvalueOf(id));

Systemoutprintln(id);

long l = redisServiceincr(tbname);

Systemoutprintln(l);

Login login = new Login();

loginsetId(l);

loginsetName("redis");

redisServicehmset(StringvalueOf(logingetId()), login);

boolean b = MySQLinsert("insert into login(id,name) values(" + logingetId()

+ ",'" + logingetName() + "')");

/

队列处理器更新mysql失败:

清除缓存数据,同时主键值自减

/

if (!b)

{

redisServicedelKeyAndDecr

(tbname, "Login:"+StringvalueOf(logingetId()));

// redisServicedelete("Login:"+StringvalueOf(logingetId()));

//redisServicedecr(tbname);

}

Systemoutprintln(redisServiceexists("Login:"+StringvalueOf(logingetId())));

Systemoutprintln(redisServiceget(tbname));

以上就是关于如何用redis来生成唯一Id全部的内容,包括:如何用redis来生成唯一Id、redis如何在shell中建表、redis 放入的值何时会没有等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9739699.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存