Как сгенерировать TimeUUID в Java/Scala
Кто-нибудь знает, как генерировать UUID на основе времени в Java/Scala?
Вот семейство столбцов:
CREATE table col(ts timeuuid)
Я использую Кассандру 1.2.4
Ценю твою помощь!
4 ответа
Решение
Кассандра имеет UUIDGen для создания Timeuuids. Источник для этого здесь:
Если вы используете драйверы Datastax, вы можете использовать служебный класс UUID для его генерации.
import com.datastax.driver.core.utils.UUIDs;
....
UUID timeBasedUuid = UUIDs.timeBased();
Я использую тот же способ для Cassandra Cli, и для имени столбца я использую
System.currentTimeMillis().toString
scala> val timestamp = System.currentTimeMillis().toString
timestamp: String = 1406279679674
ОБНОВИТЬ
в основном это зависит от вашего ключа строки, если rowKey ваш userId
или что-то, тогда нет никакой возможности представить дубликат записи в миллисекундах, но если вы думаете, что это может быть повторено, то используйте
val timestamp = com.eaio.uuid.UUIDGen.newTime().toString
это работа для версии cassandra 4.x
сначала импортируйте библиотеку вbuild.sbt
libraryDependencies ++= Seq(
"com.datastax.oss" % "java-driver-core" % "4.15.0"
)
пример
import com.datastax.oss.driver.api.core.uuid.Uuids
import java.time.ZonedDateTime
object Test extends App {
val timeText = "2022-01-01T00:01:01.002345Z"
val datetime = ZonedDateTime.parse(timeText)
val uuid = Uuids.endOf(datetime.toInstant.toEpochMilli)
println(uuid) // e79b51af-6a95-11ec-7f7f-7f7f7f7f7f7f
}
тест на кассандре
cqlsh:test> create table aaa (id timeuuid primary key, t text);
cqlsh:test> insert into aaa(id,t) values(e79b51af-6a95-11ec-7f7f-7f7f7f7f7f7f, 't4');
cqlsh:test> select toTimestamp(id), t from aaa;
system.totimestamp(id) | t
---------------------------------+----
2022-01-01 00:01:01.002000+0000 | t4