2

レコードを挿入するときに、MySQL データベースが数字と文字のみで構成される 5 桁または 6 桁のコードを生成することは可能ですか? もしそうなら、どのように?

goo.gl、bit.ly、jsfiddle のように。例:

cZ6ahF、3t5mM、xGNPN、xswUdS...

次のような値を返すUUID_SHORT()ため、機能しません23043966240817183

要件:

  1. 一意である必要があります (繰り返しなし)
  2. 主キーの整数値に基づくことができますが、必須ではありません
  3. スケーリングする必要があります (すべての可能な組み合わせが使用された場合、1 文字ずつ大きくなります)
  4. ランダムに見える必要があります。(アイテムが存在している間、アイテム1234は存在できません)BCDE1235BCDF
  5. 挿入時に生成する必要があります。

コード例をいただければ幸いです。

4

2 に答える 2

1

実際、このタスクには Redis を使用することをお勧めします。このタスクをその使用に適したものにするすべての機能を備えています。何よりも、大きなリストから値を検索するのに非常に優れています。

と の 2 つのリストを作成しbuffered_idsますused_ids。cronjob は 5 分ごと (または好きな間隔) に実行され、長さをチェックしてbuffered_ids、たとえば 5000 以上の長さを維持します。ID を使用する必要がある場合は、 からポップしてbuffered_idsに追加しused_idsます。

Redis にはsets、コレクション内の一意のアイテムである があります。キーが一意で、すべての値が「true」であるハッシュと考えてください。

bash での cronjob:

log(){ local x=$1 n=2 l=-1;if [ "$2" != "" ];then n=$x;x=$2;fi;while((x));do let l+=1 x/=n;done;echo $l; }
scale=`redis-cli SCARD used_ids`
scale=`log 16 $scale`
scale=$[ scale + 6]
while [ `redis-cli SCARD buffered_ids` -lt 5000 ]; do
    uuid=`cat /dev/urandom | tr -cd "[:alnum:]" | head -c ${1:-$scale}`
    if [ `redis-cli SISMEMBER used_ids $uuid` == 1]; then
        continue
    fi
    redis-cli SADD buffered_ids $uuid
done

アプリケーションで使用する次の uid を取得するには (言語を指定していないため、疑似コードで)

$uid = redis('SPOP buffered_ids');
redis('SADD used_ids ' . $uid);

編集実際には競合状態があります。値を安全にポップするには、最初にそれを used_ids に追加してから、buffered_ids から削除します。

$uid = redis('SRANDMEMBER buffered_ids');
redis('SADD used_ids ' . $uid);
redis('SREM buffered_ids ' . $uid);
于 2013-07-11T15:34:37.153 に答える